【问题标题】:Sql query for aggregation用于聚合的 Sql 查询
【发布时间】:2015-01-29 03:09:39
【问题描述】:

让我们考虑下表结构

Product    Year   Month Price

A         2011      01   23

A         2011      02   34

.......

.....

A       2011      12    54   
B       2011      01   13

B       2011      02   12

.......

.....

B 2011 12 20

从这张表中,我需要每 3 个月汇总一次值,即..,

Product        Year          Month              Price

A              2011          1-3                45

A              2011          4-6                23

A              2011          7-9                45

A              2011          10-12              16

A 2012 1-3 12 ………… .......

谁能告诉我如何使用 sql 查询进行此计算... 提前致谢!!!

【问题讨论】:

  • 月份和年份是varchar()?

标签: sql sql-server group-by aggregation


【解决方案1】:

试试这个。使用Case statement 将月份按季度分组,然后找到sum of price

SELECT product,
       [year],
       CASE
         WHEN ( [month] ) IN( '01', '02', '03' ) THEN '1-3'
         WHEN ( [month] ) IN( '04', '05', '06' ) THEN '4-6'
         WHEN ( [month] ) IN( '07', '08', '09' ) THEN '7-9'
         WHEN ( [month] ) IN( '10', '11', '12' ) THEN '10-12'
       END [Month],
       Sum(Price)
FROM   tablename
GROUP  BY product,
          [year],
          CASE
            WHEN ( [month] ) IN( '01', '02', '03' ) THEN '1-3'
            WHEN ( [month] ) IN( '04', '05', '06' ) THEN '4-6'
            WHEN ( [month] ) IN( '07', '08', '09' ) THEN '7-9'
            WHEN ( [month] ) IN( '10', '11', '12' ) THEN '10-12'
          END 

注意:通过查看您的 month 数据,它看起来像是 varchar 列,但您可以将其更改为 TINYINT

【讨论】:

    【解决方案2】:

    尝试在GROUP BY 子句中使用CASE

    ...
    GROUR BY [Year], CASE WHEN Month in (1,2,3) THEN '1-3'
                          WHEN Month in (4,5,6) THEN '4-6'
                      ...
                     END  
    

    【讨论】:

      【解决方案3】:

      考虑到Month存储为varchar(),可以写成:

      Select Product,
             Year,
             [MonthRange] as [Month],
             Sum(Price)
      From (
      select Product,
             Year,
             case when Month in ('01','02','03') then '[1-3]'
                  when Month in ('04','05','06') then '[4-6]'
                  when Month in ('07','08','09') then '[7-9]'
                  when Month in ('10','11','12') then '[10-12]'
             end as [MonthRange],
             Price
      from @test) as T
      Group by Product,Year,[MonthRange]
      

      DEMO

      【讨论】:

        【解决方案4】:

        选择产品,[年],如果 [月] 介于 1 和 3 之间则为“01-03”,否则如果 [月] 介于 4 和 6 之间则为“04-06”,否则为 [月] 介于 7 和9 then '07-09' else '10-12' end end end, sum([price])

        来自表 1

        按产品分组,[年],当 [月] 介于 1 和 3 之间时的情况,然后是“01-03”,否则当 [月] 介于 4 和 6 之间时,然后是“04-06”,否则当 [月] 介于 7 之间时和 9 然后是 '07-09' else '10-12' end end end

        上面的 sql 查询会给你所需的结果,如果你不使用我在月份标签中使用的前导零,那么你将不会得到按月份排序的结果。

        【讨论】:

          【解决方案5】:

          使用这个查询。

          CREATE table #test
          (
              product VARCHAR(10),
              year int, 
              month int, 
              price int
          )
          
          INSERT INTO #test
          SELECT 'A', 2011, 01, 23 UNION
          SELECT 'A', 2011, 02, 65 UNION
          SELECT 'A', 2011, 03, 45 UNION
          SELECT 'B', 2011, 04, 34 UNION
          SELECT 'B', 2011, 05, 67 UNION
          SELECT 'B', 2011, 06, 34 UNION
          SELECT 'B', 2011, 07, 87 UNION
          SELECT 'B', 2011, 08, 2 UNION
          SELECT 'B', 2011, 09, 345 UNION
          SELECT 'B', 2011, 10, 9 UNION
          SELECT 'B', 2011, 11, 293 UNION
          SELECT 'B', 2011, 12, 23 
          
              SELECT product, [year], [MONTH], SUM(price)
              FROM
              (
          
              SELECT product,  [year], CASE WHEN [MONTH] IN (01,02,03) THEN '1-3'
                                         WHEN [MONTH] IN (04,05,06) THEN '4-6'
                                         WHEN [MONTH] IN (07,08,09) THEN '7-9'
                                         WHEN [MONTH] IN (10, 11, 12) THEN '10-12'
                                   END AS [Month],    
                      price
                  FROm #Test
              )AS A
              group BY product, [year], [Month]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-24
            • 1970-01-01
            相关资源
            最近更新 更多