3

の質問の数を返す次のクエリがあります。2011年に尋ねられたすべての質問の合計を取得したいと思います。このためにを使用してROLLUPいます。

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列自体に表示されます。

エイリアスを使用して新しい列にロールアップを表示する方法はありますか?

クエリへのリンク

4

2 に答える 2

2

これを行ではなく列として表示するSUM(COUNT(*)) OVER ()には、の代わりに使用できますROLLUP。(オンラインデモ

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            
于 2011-12-07T19:25:31.330 に答える
1

次のようなアプローチを取ることができます:

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て、新しい列または独自の列に合計することもできます。複数年のクエリを実行してそれらを集計する場合もあります。

于 2011-12-07T19:21:04.420 に答える