2012-02-12 7 views
1

次の問題の解決策を見つけるのに苦労しています。 一つは、私は次のような出力を得るためにクエリを記述する必要があり、このフラグ付き/合計行を取得するためのTSQLクエリ

COL1 FLAG 
aaa 1 
aaa 0 
aaa 1 
bbb 0 

のようなテーブルを持っている、と仮定します

FLAGGED列がために「AAA」行の値の合計数が含まれてい
COL1_VALUE FLAGGED TOTAL 
aaa  2  3 
bbb  0  1 

FLAG = 1であり、TOTAL列は 'aaa'を含む行の総数です。つまり、 'aaa'を含む行の数が 'aaa'を含む行の総数に対してフラグされます。単一のクエリで可能ですか? (すなわちなど一時テーブルを使用せずに)

(MSSQL2008)

+0

それは、 "ピボット" と呼ばれています - あなたは、ピボットタグをチェックした場合の例がたくさんあります。 –

+0

'FLAG'のデータ型は?それは 'ビット'ですか? –

答えて

5
SELECT COL1 AS COL1_VALUE, 
     COUNT(CASE WHEN FLAG = 1 THEN 1 END) AS FLAGGED, 
     COUNT(*) AS TOTAL 
FROM YourTable 
GROUP BY COL1 
+1

申し訳ありませんが、「aaa」を含む行の数が、「aaa」を含む行の総数に対して表示されます。予想される結果は見られません。あなたが正しいです。 +1 – danihp

+0

これは完全に機能します!ありがとう! – Califf

4
SELECT COL1, SUM(FLAG) AS FLAGGED, Count(*) AS TOTAL from tbl GROUP BY COL1 
+1

'FLAG'が' BIT'なら 'SUM(CAST(FLAG AS INT)) 'にする必要があります。 –

+0

これはCASE..WHENを使わずにいい解決策です。 CASTのこのヒントのためにMartinに感謝します。 – Califf

0
SELECT Tab.COL1 AS COL1_VALUE, 
      SUM(CASE WHEN Tab.FLAG = 1 THEN 1 ELSE 0 END) AS FLAGGED, 
      COUNT(*) AS TOTAL 
FROM  Tab 
GROUP BY Tab.COL1 
+0

'数値(Tab.FLAG = 1の場合1 THERM 1 ELSE 0 END)AS FLAGGED 'は機能しません。 'COUNT'は' NOT NULL'行を数えます。あなたの 'CASE'式の両方のブランチは' NOT NULL'と評価されるので、 'COUNT(*)'と実質的に同じです。 –

+1

'COUNT(TO.FLAG = 1 THEN 1 ELSE 0 END)場合はTab.FLAG = 1 THEN 1 ELSE 0 END) ' – Hogan

+0

あなたは正しいです、私は自分のコードを修正しました、それは間違いでした。 – pistipanko

関連する問題