9

会社と日付でグループ化し、2 つの個別の値 (Flag=Y と Flag=N) のカウント列を生成したいと考えています。入力テーブルは次のようになります。

Company  Date   Flag
------- ------- -----
001      201201  Y
001      201201  N
001      201202  N
001      201202  N
001      201202  Y

出力は次のようになります。

Company Date   Count_Y Count_N
------- ------ ------- -------
001     201201  1       1
001     201202  1       2

SQL クエリを作成するにはどうすればよいですか? どんな種類の助けも大歓迎です!ありがとう!

4

2 に答える 2

19

次のような相関サブクエリを使用して実行できます。

SELECT 
  Company, 
  Date, 
  (SELECT COUNT(*) FROM MyTable AS T1 
     WHERE T1.Flag='Y' AND T1.Company=T2.Company AND T1.Date=T2.Date) AS Count_Y,
  (SELECT COUNT(*) FROM MyTable AS T1 
     WHERE T1.Flag='N' AND T1.Company=T2.Company AND T1.Date=T2.Date) AS Count_N
FROM MyTable AS T2
GROUP BY Company, Date

より簡潔にすることもできますが、おそらく次のSUMトリックを使用すると、読みやすさがわずかに低下します。

SELECT 
  Company, 
  Date, 
  SUM(CASE WHEN Flag='Y' THEN 1 ELSE 0 END) AS Count_Y,
  SUM(CASE WHEN Flag='N' THEN 1 ELSE 0 END) AS Count_N,
FROM MyTable
GROUP BY Company, Date

Oracle/PLSQL では、DECODE関数を使用しCASEて をさらに簡潔に置き換えることができます。

SELECT 
  Company, 
  Date, 
  SUM(DECODE(Flag,'Y',1,0)) AS Count_Y,
  SUM(DECODE(Flag,'N',1,0)) AS Count_N,
FROM MyTable
GROUP BY Company, Date
于 2012-09-10T20:46:04.250 に答える
3

このテーブルの識別子/キーがある場合は、次のようにピボットできます。

SELECT 
  [Company], 
  [Date], 
  [Y] Count_Y, 
  [N] Count_N
  FROM Company
PIVOT 
  (COUNT([ID]) FOR FLAG IN ([Y],[N])) pvt

IDテーブルの識別子はどこにありますかCompany

ここでコードをいじる


テーブルの識別子/キーがなく、Company、Date、およびFlagが唯一の列である場合、@ConradFrixがコメントで提案したようPIVOTに、それ自体のカウントを実行できます。Flag

SELECT 
  [Company], 
  [Date], 
  [Y] Count_Y, 
  [N] Count_N
  FROM Company
PIVOT 
  (COUNT(FLAG) FOR FLAG IN ([Y],[N])) pvt
于 2012-09-10T21:01:52.933 に答える