拆分当前查询以获取不同的项目

时间:2013-02-25 18:19:22

标签: sql tsql

抱歉这个问题很糟糕。希望我能在这里澄清一下:我不确定这在技术上是CTE还是看起来像是一个CTE。无论如何,如果你先看看输出,它将有助于更好地描述我正在寻找的东西:

var_Year  var_Month   var_Day   Total_Downloads
2013      2           25        100
2013      2           24        200
2013      2           23        100
2013      2           22        200
2013      2           21        100

我想要两个额外的列来显示按产品而不仅仅是总数的下载次数。然后,所需的输出如下:

var_Year  var_Month   var_Day   Total_Downloads   Downloads_Prod_A    Downloads_Prod_B
2013      2           25        100               50                  50
2013      2           24        200               90                  110
2013      2           23        100               25                  75
2013      2           22        200               125                 75
2013      2           21        100               90                  10

这是当前的SQL查询,缺少"产品A"的定义。和"产品B"。假设" f_product"是数据库中包含"产品A"或"产品B"

SELECT var_Year, var_Month, var_Day, COUNT(var_Day) AS "Total_Downloads"
 FROM
  ( SELECT 
    DISTINCT f_downloadIPaddress, 
    DATEPART(YEAR,f_downloadtimestamp) as var_Year, 
    DATEPART(MONTH,f_downloadtimestamp) as var_Month,
    DATEPART(DAY,f_downloadtimestamp) as var_Day
    FROM tb_downloads
  ) tb_tempcalendar
 GROUP BY var_Year, var_Month, var_Day
 ORDER BY var_Year desc, var_Month desc, var_Day DESC

我难以接受,因为我无法确定我是否需要在当前CTE中使用另一个CTE,或者是否可以使用COUNT(DISTINCT x)方法完成?任何帮助表示赞赏。使用SQL Server 2008 R2。

提前致谢, Beems

2 个答案:

答案 0 :(得分:3)

我真的不明白为什么你删除了你之前的问题,但无论如何,我在那里发布的答案似乎仍然对你有效,你试过吗?这是答案:

你拥有的是“派生表”,而不是CTE。现在,我认为您可以直接查询您的表,如下所示:

SELECT  DATEPART(YEAR,f_downloadtimestamp) as var_Year, 
        DATEPART(MONTH,f_downloadtimestamp) as var_Month,
        DATEPART(DAY,f_downloadtimestamp) as var_Day,
        COUNT(DISTINCT f_downloadIPaddress) Total_Downloads,
        COUNT(DISTINCT CASE WHEN f_product = 'Product A' 
                           THEN f_downloadIPaddress END) Downloads_Prod_A,
        COUNT(DISTINCT CASE WHEN f_product = 'Product B' 
                           THEN f_downloadIPaddress END) Downloads_Prod_B
FROM tb_downloads
GROUP BY DATEPART(YEAR,f_downloadtimestamp),
         DATEPART(MONTH,f_downloadtimestamp),
         DATEPART(DAY,f_downloadtimestamp)
ORDER BY var_Year desc, var_Month desc, var_Day DESC

答案 1 :(得分:2)

是的,您可以使用count (distinct)

执行此操作
SELECT var_Year, var_Month, var_Day, COUNT(distinct f_downloadIPaddress) AS "Total_Downloads",
       count(distinct case when d.product = 'A' then f_downloadIPaddress end) as ProductA,
       count(distinct case when d.product = 'B' then f_downloadIPaddress end) as ProductB
FROM (SELECT d.*, 
             DATEPART(YEAR,f_downloadtimestamp) as var_Year, 
             DATEPART(MONTH,f_downloadtimestamp) as var_Month,
             DATEPART(DAY,f_downloadtimestamp) as var_Day,
      FROM tb_downloads d
     ) d
 GROUP BY var_Year, var_Month, var_Day
 ORDER BY var_Year desc, var_Month desc, var_Day DESC

请注意:两列的总和可能大于总数。当相同的IP地址同时具有两种产品时,就会发生这种情况。