【问题标题】:SQL Server:.- group multiple columns by SUM of IDSQL Server:.- 按 ID 的 SUM 对多列进行分组
【发布时间】:2020-08-08 20:45:25
【问题描述】:

我在 SQL Server 2016 数据库上有下表

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT [ID]
      ,[comb_date]
      ,PARSE(comb_date AS datetime USING 'en-GB') as comb_date_dt
      ,[ICC_NAME]
FROM [GC].[dbo].[TABLE1]


ID      comb_date       comb_date_dt            ICC_NAME
89767   1/07/2000 4:07  2000-07-01 04:07:00.000 Wangaratta
42280   1/07/2000 4:13  2000-07-01 04:13:00.000 Geelong
25238   1/07/2000 17:28 2000-07-01 17:28:00.000 Dandenong
38419   1/07/2000 22:18 2000-07-01 22:18:00.000 Ferntree Gully
11222   1/07/2000 23:06 2000-07-01 23:06:00.000 Bendigo
47337   2/07/2000 0:17  2000-07-02 00:17:00.000 Gisborne
25239   2/07/2000 0:43  2000-07-02 00:43:00.000 Dandenong
38420   2/07/2000 2:03  2000-07-02 02:03:00.000 Ferntree Gully
66686   2/07/2000 2:57  2000-07-02 02:57:00.000 Leongatha
38421   2/07/2000 8:57  2000-07-02 08:57:00.000 Ferntree Gully
25240   2/07/2000 12:20 2000-07-02 12:20:00.000 Dandenong
11223   3/07/2000 14:26 2000-07-03 14:26:00.000 Bendigo
11224   3/07/2000 14:29 2000-07-03 14:29:00.000 Bendigo
47338   3/07/2000 15:54 2000-07-03 15:54:00.000 Gisborne
42281   3/07/2000 17:03 2000-07-03 17:03:00.000 Geelong
23147   3/07/2000 18:40 2000-07-03 18:40:00.000 Colac
59198   4/07/2000 13:15 2000-07-04 13:15:00.000 Heywood
25241   4/07/2000 14:39 2000-07-04 14:39:00.000 Dandenong
38422   4/07/2000 17:12 2000-07-04 17:12:00.000 Ferntree Gully
25242   4/07/2000 20:59 2000-07-04 20:59:00.000 Dandenong
...
...
...    30/06/2018 22:30 2018-06-30 22:30:00.000 ORBOST

该表显示了每个 ICC_NAME 从 2000 年 7 月到 2018 年 6 月的所有事件。大约有 30 个唯一的 ICC_NAME 值。

我想要得到的是一个输出,其中包含年月(从 2000-07 到 2018-06)作为行(dt_yyyy_mm),每个 ICC_NAME 作为列和每个年月的月计数/数字记录总和和 ICC_NAME。

dt_yyyy_mm    Dandenong    Ferntree Gully    Heywood    Geelong    Gisborne ... ...    Wangaratta
2000-01       21           9                 14         27         6        ... ...    16
2000-02       17           11                20         4          15       ... ...    19
... ...
2018-06       13           7                 9          11         2        ... ...    13

我假设我需要在记录上使用多个“组”并按 ID 总和 分别为每个 yyyy-mm 和 ICC_NAME,但我不知道从哪里开始。

【问题讨论】:

    标签: sql sql-server date sum pivot


    【解决方案1】:

    如果事先知道icc_names的列表,可以使用条件聚合如下:

    select
        format(comb_date, 'yyyy-MM') dt_yyyy_mm,
        sum(case when icc_name = 'Dandenong' then 1 else 0 end) Dandenong,
        sum(case when icc_name = 'Ferntree Gully' then 1 else 0 end) Ferntree_Gully,
        ...
    from [GC].[dbo].[TABLE1]
    group byormat(comb_date, 'yyyy-MM')
    order by dt_yyyy_mm
    

    【讨论】:

      【解决方案2】:

      没有动态SQL和2条语句就无法完成。您要查找的是 PIVOT 语句,但 PIVOT 需要在 SQL 中定义新列。这意味着您不能动态获取它们 - 您首先需要获取所有列,然后为 PIVOT 创建 SQL 语句,然后使用 Execute SQL(或从您的应用程序)发出该语句。

      【讨论】:

        猜你喜欢
        • 2021-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多