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

Sql 拆分当前查询以获取不同的项,sql,tsql,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

对不起,问题标题太差了。希望我能在这里澄清一下:我不确定这在技术上是一个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”是数据库中包含“product A”或“product B”的字段

我被难住了,因为我无法确定我是否需要在当前的CTE中添加另一个CTE,或者是否可以使用计数(DISTINCT x)方法来完成?感谢您的帮助。使用SQLServer2008R2

提前感谢,,
Beems

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

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

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

我真的不明白你为什么删除了之前的问题,但不管怎样,我在那里发布的答案似乎对你仍然有效,你试过了吗?。答案如下:

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

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

是的,您可以使用
count(distinct)
执行此操作:


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

是的,您可以使用
计数(不同)
执行此操作:


注意:两列的总和可能大于总和。当同一IP地址同时拥有两种产品时,就会出现这种情况。

伙计,你直接从我下面偷走了答案——我甚至还想谈论CTEs与派生表:)@ean5533如果这似乎是一个快速的答案,那是因为我主要是复制粘贴了同一问题的先前答案,op出于某种原因被删除了。不涉及巫术;-)我道歉。谢谢你的回复。我在一家公司工作,该公司正在为一家软件公司托管产品下载,他们要求提供一些我们没有的报告功能,因此我为他们构建了一个自定义表。不幸的是,我无意中在原始帖子中发布了一些识别信息。我本可以简单地编辑原稿,但您的代码中已经包含了信息。谢谢,这是可行的。有一件事我还不明白,为什么我的问题和你的答案中的原文给出了不同的“Total_下载”总数。我在想为什么。如果我将它们并排运行,它们就不匹配。对于“产品A”和“产品B”等于零的“总下载量”匹配的天数,但对于有数字的天数,我们的“总下载量”字段不匹配。@Beems原始查询中的解决方案是使用
SUM(CASE WHEN…THEN 1 ELSE 0 END)
计算产品A和产品B,这意味着它将被视为每个记录的下载,而不是每个不同的ip地址的下载。这与这个答案不同,我计算的是产品下载的不同ip地址,也就是说,如果您的表上有相同的ip地址,并且使用相同的产品,那么它将只计算为一次下载,你直接从我下面偷走了答案——我甚至打算谈论CTE与派生表:)@ean5533如果这似乎是一个快速的答案,那是因为我主要是复制粘贴了同一个问题的上一个答案,op出于某种原因删除了该答案。不涉及巫术;-)我道歉。谢谢你的回复。我在一家公司工作,该公司正在为一家软件公司托管产品下载,他们要求提供一些我们没有的报告功能,因此我为他们构建了一个自定义表。不幸的是,我无意中在原始帖子中发布了一些识别信息。我本可以简单地编辑原稿,但您的代码中已经包含了信息。谢谢,这是可行的。有一件事我还不明白,为什么我的问题和你的答案中的原文给出了不同的“Total_下载”总数。我在想为什么。如果我将它们并排运行,它们就不匹配。对于“产品A”和“产品B”等于零的“总下载量”匹配的天数,但对于有数字的天数,我们的“总下载量”字段不匹配。@Beems原始查询中的解决方案是使用
SUM(CASE WHEN…THEN 1 ELSE 0 END)
计算产品A和产品B,这意味着它将被视为每个记录的下载,而不是每个不同的ip地址的下载。这与这个答案不同,我计算的是产品下载的不同ip地址,也就是说,如果您的表上有相同的ip地址,并且使用相同的产品,那么它将只计算为一次下载。谢谢,这非常有效!我不知道“CASE”语法的存在,所以你可能在比这更重要的方面帮助了我。再次感谢,谢谢,这很好用!我不知道“CASE”语法的存在,所以你可能在比这更重要的方面帮助了我。再次感谢你,比姆斯
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