【问题标题】:SQL count and group then pivotSQL 计数和分组然后转置
【发布时间】:2017-10-03 19:32:15
【问题描述】:

所以,我一直有这个问题,我想我只是太忙了,无法弄清楚。我有一个需要计算的数据库。这都很好。但是我遇到的问题是我只需要将它存储为 2 行,1 行用于所有日期,1 行用于计数。这是一个例子:

obj_name | date_made
--------------------
   1     | 2016-3-04
   2     | 2016-5-23
   3     | 2016-5-23
   4     | 2016-5-23
   5     | 2016-6-07
   6     | 2016-6-07
   7     | 2016-6-07
   8     | 2016-6-07
   9     | 2016-9-12
   10    | 2016-9-12

我想要的是计算在某个日期创建了多少对象,然后将其返回为 2 行 - 一行包含所有日期,另一行包含所有计数

Row1 | 2016-3-04 |  2016-5-23 |  2016-6-07  |  2016-9-12
Row2 |     1     |      3     |      4      |      2

如果有人能提供帮助,将不胜感激。

这是我目前所拥有的,我可以获得我需要的所有信息,但需要 2 列,我需要 2 行

SELECT datem,
     SUM(num) AS total_num
FROM (
     SELECT date_made AS datem,
            obj_name,
            COUNT(1) AS num
     FROM db.tn
     GROUP BY 1,2
) sub
GROUP BY 1
ORDER BY 1 DESC

【问题讨论】:

  • 什么是 RDBMS?到目前为止,您尝试了什么(包括到目前为止的查询)。
  • 您将其存储到哪种语言中?
  • 到目前为止,这就是我所拥有的,我已经将它显示为列,只需要转动它

标签: sql group-by count pivot unpivot


【解决方案1】:

您可以尝试如下所示的动态数据透视查询

   DECLARE @cols AS NVARCHAR(MAX),@query  AS NVARCHAR(MAX)
    SELECT @cols = STUFF((SELECT  ',' + QUOTENAME(date_made) 
                        FROM tbl
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    SELECT @query = 
    'SELECT * FROM '+
    '(SELECT COUNT(1) count, date_made FROM tbl ) src '+
    ' pivot '+
    '( max(count) for date_made in ('+@cols+'))p'

    EXEC(@query)

【讨论】:

    【解决方案2】:

    如果我没看错的话,你最终会得到一个如下所示的聚合表:

    date_made | count
    ----------|------
    2016-3-04 |  1
    2016-5-23 |  3
    2016-6-07 |  4
    2016-9-12 |  2
    

    然后您希望将表格旋转到其一侧,使其看起来像您最初问题中的输出。因此,我认为这是对这个问题的重复:

    Simple way to transpose columns and rows in Sql?

    【讨论】:

      猜你喜欢
      • 2012-09-03
      • 2014-05-22
      • 2016-11-26
      • 2019-10-04
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      相关资源
      最近更新 更多