2016-07-06 9 views
0

私はこの問題にぶち当たっていますが、単純な解決策が必要であることがわかりますが、見つけられません。SQL Serverで句を持つがGroup By節に列選択を使用する方法

私は、特定の日付の間に部分ごとのシリアル番号を取得したいと考えています。日付の選択がなければ、このように見えます。

SELECT 
    Part_Name, 
    COUNT(DISTINCT Serial_No) AS 'Serial Frequency' 
FROM Inventory 
GROUP BY Part_Name 

そして、パーツあたりのシリアル数がわかります。

part1 55  
part2 32 
part3 48 
etc etc 

だから、これを2つの日付の間で選択してください。私はHavingを使用する必要があることを知っていますが、これはセクションごとにグループに追加しなければなりません。 I.

SELECT 
    Part_Name, 
    COUNT(DISTINCT Serial_No) AS 'Serial Frequency' 
FROM Inventory 
GROUP BY Part_Name, Grade_Date 
HAVING Grade_Date > '2016-06-01' AND Grade_Date < '2016-07-01' 

出力:

part1 1 
part1 1 
part1 1 
part2 1 
part2 1 
etc etc 

無愛想これを行うことができますので、私はここに明らかにどのような事をしないのですか?これを含めると、このエラーが発生します。

列「Inventory.Grade_Date」は、集計関数またはGROUP BY句に含まれていないため、HAVING句では無効です。

答えて

1

where句は、集計されたものではなく実際の値を比較するため使用します。

SELECT 
Part_Name, 
Grade_Date, 
COUNT(DISTINCT Serial_No) AS 'Serial Frequency' 
FROM Inventory 
WHERE Grade_Date > '2016-06-01' AND Grade_Date < '2016-07-01' 
GROUP BY Part_Name,Grade_Date 
+0

まあまあ!私はどこで使用しようとしていると誓って、それは私にエラーを投げたので、私はグループで一緒に持っていた。だから、あなたが何かをグループ句で比較しているときです。それは理にかなっている。 – Danrex

0

あなたは集計を行う前Grade_Dateでフィルタリングすると、あなたはどちらかGROUP BYまたはSELECTGrade_Dateを含めるべきではありません。

SELECT Part_Name, COUNT(DISTINCT Serial_No) AS SerialFrequency 
FROM Inventory 
WHERE Grade_Date > '2016-06-01' AND Grade_Date < '2016-07-01' 
GROUP BY Part_Name; 

コメント:

  • 私が期待します最初の比較は>=です。
  • エスケープ文字を必要とする列エイリアスは使用しないでください。
  • 一重引用符を使用して列別名を定義しないでください。文字列と日付の定数には一重引用符を使用してください。
  • DISTINCTが不要な場合は、取り外します。 DISTINCTは、計算に余分なオーバーヘッドを生じます。
+0

これは私がやっていることですが、より良い方法がなければならないようです。 @Danrex。 – Danrex

+0

。 。あなたの質問は、これがあなたがやっていることを示唆していません。 –

関連する問題