【问题标题】:SQL - How to combine 2 dates from different tables with joins without errorSQL - 如何将来自不同表的 2 个日期与联接无错误地结合起来
【发布时间】:2018-09-16 07:20:03
【问题描述】:

我是我的公司,有 2 个表来承载活动信息和网店信息。

基本信息

在活动表中,它携带如下信息:

CAMPAIGN_NAME  CREATION_DATE  NUM_DELIVERED  NUM_ERRORS
Promotion 101   2013-01-05      100,000        100
Promotion 105   2013-01-05      135,000        200
Promotion 104   2013-01-05      125,000         0
Promotion 103   2013-01-06      50,000          0

在网上商店中它带有这样的信息

VISIT_KEY    VISIT_AT  .....
 100200     2013-01-05
 105235     2013-01-05
 103050     2013-01-05

期望的结果

我们想建立一个表格来显示每天的效果,比如

CREATION_DATE    VISIT_AT   NUM_DELIVERED  NUM_VISITS
 2013-01-05     2013-01-05    260,000        30,000
 2013-01-06     2013-01-06     50,000          0 

方法前后
为了收集信息,在我们使用union方法之前,首先在单独的表中进行聚合,然后将UNION ALL到另一个表中,

SELECT 
   campaign_date,
   visit_date,
   SUM(delivered),
   SUM(visits)
FROM
    ((Select
       CREATION_DATE::DATE as campaign_date,
       '1970-01-01'::DATE as visit_date
       SUM(NUM_DELIVERED) as delivered
       0 AS visits
    FROM 
       campaign
    GROUP BY 1,2)
    UNION ALL
    (Select
       '1970-01-01'::Date AS campaign_date,
       VISIT_AT::DATE AS visit_date
       0 AS delivered
       COUNT(VISIT_KEY) AS visits
    FROM 
       campaign
    GROUP BY 1,2))
 GROUP BY 1,2

看起来像这样

campaign_date visit_date   delivered      visits
2013-01-05    1970-01-01    260,000          0
1970-01-01    2013-01-05       0          30,000
2013-01-06    1970-01-01     50,000          0     

现在我尝试与campaign.CREATION_DATE = webshop.VISIT_AT 上的左连接结合起来,如下所示:

Select 
  campaign.CREATION_DATE as campaign_date, 
  webshop.VISIT_AT as visits,
  SUM(campaign.NUM_DELIVERED) as delivered,
  COUNT(webshop.VISIT_KEY) AS visits
FROM 
  webshop LEFT JOIN campaign ON webshop.VISIT_AT = campaign.CREATION_DATE

但数字完全不同……

问题

1,此查询中可能出现的错误是什么?因为我想得到相同的信息,并且应该得到相同的结果......

2、我怎样才能达到预期的效果?

供您参考,我使用的是 Amazon redshift。

非常感谢您提前提供的帮助,祝您周末愉快!

【问题讨论】:

  • 您使用的是哪个DBMS? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签postgresqloraclesql-serverdb2、...
  • edit您的查询并添加产生错误的查询。 Formatted textno screen shots。 (edit 您的问题 - 在 cmets 中邮政编码或其他信息)
  • 您是说每个广告系列运行一天,并且在任何一天都可以有一个且只有一个正在运行的广告系列?

标签: sql join union amazon-redshift


【解决方案1】:

一种方法使用union allgroup by

select dte, sum(num_delivered) as num_delivered, sum(num_visits) as num_visits
from ((select creation_date as dte, sum(num_delivered) as num_delivered, 0 as num_visits
       from campaign
       group by creation_date
      ) union all
      (select visit_at, 0 as num_delivered, sum(num_visits) as num_visits
       from webshop
       group by visit_at
      )
     ) cw
group by dte
order by dte;

我认为没有理由有两个日期列。

另一种方法是聚合后的full outer join

select coalesce(creation_date, visit_at) as dte,
       coalesce(num_delivered, 0) as num_delivered, 
       coalesce(num_visits, 0) as num_visits
from (select creation_date, sum(num_delivered) as num_delivered, 0 as num_visits
      from campaign
      group by creation_date
     ) c full outer join
     (select visit_at, 0 as num_delivered, sum(num_visits) as num_visits
      from webshop
      group by visit_at
     ) 
     on w.visit_at = c.creation_dte
order by dte;

【讨论】:

    【解决方案2】:

    解决您的问题:

    使用DISTINCT

    SELECT DISTINCT c.Creation_Date, 
           c.Creation_Date AS Visit_At, 
           c.Num_Delivered, 
           c.Num_Visits
    FROM (
          SELECT c.Creation_Date, 
                 SUM(c.Num_Delivered) AS Num_Delivered, 
                 SUM(c.Num_Errors) AS Num_Visits
          FROM Campaign AS c
          GROUP BY c.Creation_Date
         ) AS c
    LEFT JOIN Webshop AS w
    ON c.Creation_Date = w.Visit_At
    

    您可以使用GROUP BY 代替DISTINCT

    SELECT c.Creation_Date, c.Creation_Date AS Visit_At, c.Num_Delivered, c.Num_Visits
    FROM (
          SELECT c.Creation_Date, SUM(c.Num_Delivered) AS Num_Delivered, SUM(c.Num_Errors) AS Num_Visits
          FROM Campaign AS c
          GROUP BY c.Creation_Date
         ) AS c
    LEFT JOIN Webshop AS w
    ON c.Creation_Date = w.Visit_At
    GROUP BY c.Creation_Date, c.Creation_Date , c.Num_Delivered, c.Num_Visits
    

    输出:

    Creation_Date   Visit_At     Num_Delivered  Num_Visits
    2013-01-05      2013-01-05   360000          30000
    2013-01-06      2013-01-06   50000           0
    

    演示链接:

    http://sqlfiddle.com/#!9/22fe0/1

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2016-03-04
      • 2018-05-07
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多