【问题标题】:How to display rollup data in new column?如何在新列中显示汇总数据?
【发布时间】:2012-01-15 04:57:30
【问题描述】:

我有以下查询,它返回 2011 年 StackOverflow 上每天 问题的数量。我想获得 2011 年提出的所有问题的总和。为此,我使用 @ 987654324@.

select 
  year(p.CreationDate) as [Year],
  month(p.CreationDate) as [Month],
  day(p.CreationDate) as [Day],
  count(*) as [QuestionsAskedToday]
from Posts p 
  inner join PostTags pt on p.id = pt.postid
  inner join Tags t on t.id = pt.tagid
where 
  t.tagname = 'android' and
  p.CreationDate > '2011-01-01 00:00:00'
group by year(p.CreationDate), month(p.CreationDate),day(p.CreationDate)
​with rollup
order by year(p.CreationDate), month(p.CreationDate) desc,day(p.CreationDate) desc​

这是输出:

2011 年每天提出的所有问题的总和显示在 QuestionsAskedToday 列本身中。

有没有办法在带有别名的新列中显示汇总?

Link to the query

【问题讨论】:

    标签: android tsql rollup


    【解决方案1】:

    你可以采取这样的方法:Example

    SELECT 
       YEAR(p.CreationDate) AS 'Year'
       , CASE
            WHEN GROUPING(MONTH(p.CreationDate)) = 0
               THEN CAST(MONTH(p.CreationDate) AS VARCHAR(2))
            ELSE 'Totals:'
         END AS 'Month'
       , CASE
            WHEN GROUPING(DAY(p.CreationDate)) = 0
            THEN CAST(DAY(p.CreationDate) AS VARCHAR(2))
            ELSE 'Totals:'
         END AS [DAY]
       , CASE
            WHEN GROUPING(MONTH(p.CreationDate)) = 0
               AND GROUPING(DAY(p.CreationDate)) = 0 
                  THEN COUNT(1)
         END AS 'QuestionsAskedToday'
       , CASE
            WHEN GROUPING(MONTH(p.CreationDate)) = 1
               OR GROUPING(DAY(p.CreationDate)) = 1
                  THEN COUNT(1)
         END AS 'Totals'
    FROM Posts AS p
    INNER JOIN PostTags AS pt ON p.id = pt.postid
    INNER JOIN Tags AS t ON t.id = pt.tagid
    WHERE t.tagname = 'android'
       AND p.CreationDate >= '2011-01-01'
    GROUP BY ROLLUP(YEAR(p.CreationDate)
       , MONTH(p.CreationDate)
       , DAY(p.CreationDate))
    ORDER BY YEAR(p.CreationDate)
       , MONTH(p.CreationDate) DESC
       , DAY(p.CreationDate) DESC​​​​​​​
    

    如果这是您想要的,同样的技术也可以应用于Years,如果您想查询多年并聚合它们,也可以将它们汇总到新列或它们自己的列中。

    【讨论】:

    • 这就是我想要的。谢谢。
    【解决方案2】:

    要将其显示为列而不是行,您可以使用SUM(COUNT(*)) OVER () 而不是ROLLUP。 (Online Demo)

    SELECT YEAR(p.CreationDate)  AS [Year],
           MONTH(p.CreationDate) AS [Month],
           DAY(p.CreationDate)   AS [Day],
           COUNT(*)              AS [QuestionsAskedToday],
           SUM(COUNT(*)) OVER () AS [Total]
    FROM   Posts p
           INNER JOIN PostTags pt
             ON p.id = pt.postid
           INNER JOIN Tags t
             ON t.id = pt.tagid
    WHERE  t.tagname = 'android'
           AND p.CreationDate > '2011-01-01 00:00:00'
    GROUP  BY YEAR(p.CreationDate),
              MONTH(p.CreationDate),
              DAY(p.CreationDate)  
    ORDER  BY YEAR(p.CreationDate),
              MONTH(p.CreationDate) DESC,
              DAY(p.CreationDate) DESC            
    

    【讨论】:

      猜你喜欢
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多