SQL将多行放入一行,具有按类别和日期分组的不同列数

时间:2011-04-29 01:54:40

标签: sql

我有一张桌子的小样本:

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

2 个答案:

答案 0 :(得分:0)

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

    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

答案 1 :(得分:0)

您是否可以将您显示结果的查询,称之为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;

由于三个条目中的两个是零,这是否能满足您的需求?