0

抱歉,问题标题很差。希望我能在这里澄清一下:我不确定这在技术上是 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。

提前致谢, 比姆斯

4

2 回答 2

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
于 2013-02-25T18:24:40.330 回答
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 地址时会发生这种情况。

于 2013-02-25T18:26:41.557 回答