繁体   English   中英

SQL 用于多行合并为一行,不同的列数按类别和日期分组

[英]SQL for Multiple rows into one row with different column counts grouped by Category and date

我有一张我们的桌子的小样本:

User   Category  InitialDate   LastRequestDate   LastUpdate
1      1907      1/1/2010      2/1/2011          1/15/2011
2      6509      6/10/2010     4/1/2011          3/15/2011
3      3102      3/1/2010      3/15/2011         2/17/2011
4      3102      3/1/2010      2/15/2011         3/17/2011
5      6509      5/10/2010     2/1/2011          1/25/2011
6      1907      1/1/2010      3/1/2011          4/15/2011

每个用户在表中有一行,并且不断添加用户。
目前大约有 30 个类别,但总是在添加新类别。

我需要为每个类别的每一天做一个汇总表,计数是什么......

除了做临时表、游标等之外,您是否有关于处理此问题的最佳方法的建议......? 我正在考虑使用 row_number 分区或 / 和 cte ...但不确定如何执行此操作... Group By 将无法工作,因为日期在同一行...当使用 Group by 我得到 3具有重复计数的每个 SKU 的行...

Date           Catalog    InitialCount    LastRequestCount     LastUpdateCount
1/1/2010       1907       2               0                    0       
3/1/2010       3102       2               0                    0
5/10/2010      6509       1               0                    0
6/10/2010      6509       1               0                    0
1/15/2011      1907       0               0                    2
1/25/2011      6509       0               0                    1
2/1/2011       1907       0               1                    0
2/1/2011       6509       0               1                    0
2/15/201       3102       0               1                    0
2/17/2011      3102       0               0                    1
3/1/2011       1907       0               1                    0
3/15/2011      3102       0               1                    0
3/17/2011      3102       0               0                    1
4/1/2011       6509       0               1                    0
4/15/2011      1907       0               0                    1

运行每个类别和相应日期的不同实例的预查询...然后,以此为基础获得下一个级别...

    select 
          PreQuery.UniqDate,
          PreQuery.Category,
          sum( case when PreQuery.UniqDate = YT.InitialDate then 1 else 0 end ) InitialCount,
          sum( case when PreQuery.UniqDate = YT.LastRequestDate then 1 else 0 end ) LastRequestCount,
          sum( case when PreQuery.UniqDate = YT.LastUpdate then 1 else 0 end ) LastUpdateCount
       from
          ( select distinct
                  Category,
                  InitialDate UniqDate
               from 
                  YourTable
            union
            select
                  Category,
                  LastRequestDate UniqDate
               from
                  YourTable
            union
            select
                  Category,
                  LastUpdate UniqDate ) PreQuery
          join YourTable YT
             on PreQuery.Category = YT.Category
             AND ( PreQuery.UniqDate = YT.InitialDate
                 OR PreQuery.UniqDate = YT.LastRequestDate
                 OR PreQuery.UniqDate = YT.LastUpdate )
      group by
         PreQuery.UniqDate,
         PreQuery.Category

你能不能把你已经显示结果的查询,称之为T,然后做

SELECT Date, Catalog, SUM(InitialCount) AS InitialCount,
             SUM(LastRequestCount) AS LastRequestCount,
             SUM(LastUpdateCount) AS LastUpdateCount
FROM ( /* your existing query goes here */ ) AS T GROUP BY Date, Catalog;

由于三个条目中的两个为零,这是否给出了您想要的?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM