SQL计数和组然后转动

时间:2017-10-03 19:32:16

标签: sql group-by count pivot unpivot

所以,我一直遇到这个问题,我想我太过分了。我有一个我需要数据的数据库。这一切都很好。但是我遇到问题的地方是我需要将它存储为只有2行,一行用于所有日期,一行用于计数。这是一个例子:

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

2 个答案:

答案 0 :(得分:0)

您可以尝试动态透视查询,如下所示

   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)

答案 1 :(得分:0)

如果我读得正确,你最终会得到一个如下所示的聚合表:

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?