同じテーブルから2つの集計されたサブセットをマージするSQLクエリ

StackOverflow https://stackoverflow.com/questions/4572490

  •  14-10-2019
  •  | 
  •  

質問

data.stackexchangeクエリを書き、調べました ユーザーが質問と回答を投稿する日の時間. 。そこでSQLを見ることができます。結果は今のように見えます:

hour hour questions answers 
---- ---- --------- ------- 
0    0    1         4       
null 2    null      4       
null 3    null      5       
null 4    null      7       
null 5    null      11      
null 6    null      10      
null 7    null      6       
null 8    null      1       
null 13   null      1       
null 14   null      7       
null 15   null      8       
null 16   null      11      
null 17   null      4       
null 18   null      10      
null 19   null      4       
null 20   null      6       
null 21   null      7       
22   22   1         6       
null 23   null      2     

クエリを次のように変更するにはどうすればよいですか。

  1. 両方の時間列を単一の列にマージし、
  2. 質問/回答がある場合 null, 、 に設定 0 代わりは。

パート2は優先度が低いです。

編集: :答えに基づいて改善しようとしているので、元のクエリの完全なSQLです。

SELECT
   q.hour, a.hour, questions, answers
FROM
(
   SELECT
     datepart(hour,creationdate) AS hour,
     count(*) AS questions
   FROM posts
   WHERE posttypeid=1 AND OwnerUserId=##UserID##
   GROUP BY datepart(hour,creationdate)
) q
FULL JOIN 
(
   SELECT
     datepart(hour,creationdate) AS hour,
     count(*) AS answers
   FROM posts
   WHERE posttypeid=2 AND OwnerUserId=##UserID##
   GROUP BY datepart(hour,creationdate)
) a
ON q.hour = a.hour
ORDER BY a.hour, q.hour
役に立ちましたか?

解決

SELECT
   ISNULL(q.hour, a.hour) AS hour, 
   ISNULL(questions,0) AS questions, 
   ISNULL(answers,0) AS answers

または、クエリを書き直して削除します full join

   SELECT
     datepart(hour,creationdate) AS hour,
     count(CASE WHEN posttypeid = 1 THEN 1 END) AS questions,
     count(CASE WHEN posttypeid = 2 THEN 1 END) AS answers
   FROM posts
   WHERE posttypeid IN (1,2) AND OwnerUserId=##UserID##
   GROUP BY datepart(hour,creationdate)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top