2016-09-02 16 views
-2

いくつかの列を一覧表示するためにT-SQLクエリを作成しようとしています。GROUP BY with SQL ServerのWHERE句

これは私が私のテーブルに持っているものです。

Category | Verdict  | Requests 
-----------|--------------|---------- 
Category1 | Allowed  | 1000 
Category2 | denied_now | 100 
Category2 | denied_later | 101 
Category3 | Allowed  | 203 

私はこのような結果に終わると思いました。

Category | Verdict  | Requests 
-----------|--------------|---------- 
Category1 | Allowed  | 1000 
Category2 | denied_all | 201 
Category3 | Allowed  | 203 

私はGROUP BYHAVINGと組み合わせSELECTを試してみましたが、私は常にエラーを取得します。 Verdict = denied%の新しい名前でこれらの値を新しい行に結合する方法は?

+1

あなたのロジックは何ですか?カテゴリ4はどうして突然現れますか?あなたの試しは何ですか?あなたのエラーは何ですか? – techspider

+0

あなたの試行を投稿してください。投稿されたテーブルと結果から、必要なものを知ることは不可能です。シンプルな 'select *'と 'where'条件のように見えるので、techspiderがコメントしたもののほかに、何かが欠けているはずです。 – Andrew

答えて

1

私は、これはトリックを行うべきだと思う:

SELECT Category, CASE WHEN Verdict LIKE 'denied%' THEN 'denied_all' ELSE Verdict END AS Verdict, SUM(Requests) Requests 
FROM TableName 
GROUP BY Category, CASE WHEN Verdict LIKE 'denied%' THEN 'denied_all' ELSE Verdict END 
ORDER BY Category 

私はあなたがHAVING任意の状態を必要と表示されません。彼らはグループ化することができますので、その後、私はカテゴリーとによってグループが評決を修正し、最終的に要求フィールドのすべての値を合計する「denied_all」で評決「%を拒否された」それでは、私はここでやっているだけですべて置き換えて

。大きな秘密はありません。

あなたがCASE WHENを繰り返したくない場合は、私はあなたがこれらのいずれかに行かなければならないと思う:

SELECT Category, Verdict, SUM(Requests) Requests 
FROM (
    SELECT Category, CASE WHEN Verdict LIKE 'denied%' THEN 'denied_all' ELSE Verdict END AS Verdict, Requests 
    FROM TableName 
) SubQ 
GROUP BY Category, Verdict 
ORDER BY Category 

または:

;WITH SubQ AS 
(
    SELECT Category, CASE WHEN Verdict LIKE 'denied%' THEN 'denied_all' ELSE Verdict END AS Verdict, Requests 
    FROM TableName 
) 

SELECT Category, Verdict, SUM(Requests) Requests 
FROM SubQ 
GROUP BY Category, Verdict 
ORDER BY Category 
+0

が説明されていない理由です。 GROUP BYは存在するレコードを壊し、SELECTステートメントはグループの後に発生するため、SELECTステートメントの値を変更することはできません(なぜこれが複製されるのか)。 SQLは値を比較しているので、スムージングしています。別の場合は、そのロジックがコードを壊さないでしょう。 –

+0

申し訳ありませんが、私はあなたを理解していません。元のクエリには、テストなしで入力したときの小さなエラーが1つありましたが、現在は修正されており、完全に機能しています。選択されたものがグループ化されたものと一致する限り、変更されたかどうかに関係なく機能します。 – Andrew

+0

実際には、私はOPのために覚えていた。あなたの質問は素晴らしいです。 :) –