2016-04-07 7 views
0

私は2つのテーブルPOPO_Lineを持っていると私はPOからすべてのフィールドに加えて、私は、クエリ何かを書くだろうPOの各行にリンクPO_Lineから行の数量を一覧表示するとします以下のような -グループ

SELECT 
    PO.propA, 
    PO.propB, 
    PO.propC, 
    PO.propD, 
    PO.propE, 
    ... 
    PO.propY, 
    COUNT(PO_Line.propA) LINES 
FROM 
    PO 
LEFT JOIN 
    PO_Lines 
ON 
    PO.ID = PO_Lines.PO_ID 

明らかにこれは、の線に沿ってエラーいろいろ書いを与えるだろう - それは、集計関数のいずれかに含まれていないため

列「PO.propA」が選択リストにinvaalidされますか、 GROUP BY句

だから、そうのように、私は、クエリの最後にGROUP BY句を追加し、コピーして、自分の選択ラインを貼り付けます実行するクエリを取得する - 完璧しかしそれはすべての感触を作品

SELECT 
    PO.propA, 
    PO.propB, 
    PO.propC, 
    PO.propD, 
    PO.propE, 
    ... 
    PO.propY, 
    COUNT(PO_Line.propA) LINES 
FROM 
    PO 
LEFT JOIN 
    PO_Lines 
ON 
    PO.ID = PO_Lines.PO_ID 
GROUP BY 
    PO.propA, 
    PO.propB, 
    PO.propC, 
    PO.propD, 
    PO.propE, 
    ... 
    PO.propY 

私は列の名前てきた場合は特に、少し扱いに​​くいすなわち -

SELECT 
    PO.propA AS 'FIRST PROPERTY', 
    PO.propB AS 'SECOND PROPERTY', 
    PO.propC AS 'THIRD PROPERTY', 
    PO.propD AS 'ANOTHER PROPERTY', 
    PO.propE AS 'YOU GET THE IDEA', 
    ... 
    PO.propY 

と私はコピー/ select句からエントリを貼り付けた後、列名を削除する必要があります。

私の質問です - 選択句で見つかったすべての集約されていないエントリでグループを言う簡略な方法はありますか?

+0

あなただけの集計列と非集計キーフィールドにSELECTを行い、その後、別のSELECT DISTINCTに参加することができます残りの非集約フィールドのうちの1つを選択します。これも扱いにくいですが、非集約フィールドのすべてを明示的にリストするのではなく、SELECT *を実行できるという利点があります。 – mbeckish

答えて

2

私はあなただけでウィンドウ関数をしたいと思う:

SELECT . . ., 
     COUNT(PO_Line.propA) OVER (PARTITION BY PO.ID) as LINES 
FROM PO LEFT JOIN 
    PO_Lines 
    ON PO.ID = PO_Lines.PO_ID; 
+1

これは、選択が 'PO'からの列のみを取得していると仮定して、重複した行をたくさん返すかもしれません。 – Lucero

1

私はコピー/ select句からエントリを貼り付けた後、列名を削除する必要があります。

私が強く最初の要素としてblock/column selection .Move ,を使用して、エイリアスをallignすることをお勧め:SQL Server Management Studio

SELECT 
    PO.propA AS 'FIRST PROPERTY' 
    ,PO.propB AS 'SECOND PROPERTY' 
    ,PO.propC AS 'THIRD PROPERTY' 
    ,PO.propD AS 'ANOTHER PROPERTY' 
    ,PO.propE AS 'YOU GET THE IDEA' 
    ... 
    ,PO.propY 
    ,COUNT(PO_Line.propA) LINES 
FROM PO 
LEFT JOIN PO_Lines 
    ON PO.ID = PO_Lines.PO_ID 
GROUP BY 
    ... 

enter image description here

簡単なブロック選択SHIFT + ALTハイライトを使用しますペースト。

他のエディタを使用している場合は、対応するキーショートカットhereを見つけてください。

スキーマ、エイリアスなどを追加するなど、複数の編集を一度に行うと便利です。あなたのクエリを読む

+0

中途半端なエディタ(少なくともWindowsでは)は、ブロック選択にAltを使用します。これはMS Wordでも機能します! ;) – Lucero

+1

あなたの 'SELECT'節を書式化する必要があるので、少し厄介なので、長さの異なるフィールドを持っているときに、それらはすべて整列する必要がありますが、私は何か新しいことを学んだと言います。 –

+0

@JohnCだから、['Redgate'](http://www.red-gate.com/assets/INTERIM/assets/products/sql-prompt/images/one-click-sql-formatting)のようなツールを使うべきです.png)または 'Apex'を使用します。 – lad2025

1

私はあなたがで開始するGROUP BYを必要としないかもしれないと思う:

SELECT 
    PO.propA, 
    PO.propB, 
    PO.propC, 
    PO.propD, 
    PO.propE, 
    ... 
    PO.propY, 
    (SELECT COUNT(*) FROM PO_Lines WHERE PO.ID = PO_Lines.PO_ID) LINES 
FROM 
    PO