抱歉这个问题很糟糕。希望我能在这里澄清一下:我不确定这在技术上是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
答案 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地址同时具有两种产品时,就会发生这种情况。