2017-10-11 9 views
1

UNIONクエリから行の数を調べたいとします。ユニオンクエリからカウントを調べる方法は?

私はこれを試してみました:

SELECT COUNT(*) FROM (
    SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) 
    FROM [Laola].[AGG_0] 
    GROUP BY Platform, DeviceCategory 
    UNION 
    SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) 
    FROM [Laola].[AGG_2] 
    GROUP BY Platform, DeviceCategory 
) x 

私は次のエラーを受け取りました:

No column was specified for column 3 of x

+0

これは 'NO列に対処しないポストはX 'の列番号に指定された非常に多くの一つである彼らはすべての異なるソースを持っています本質的に答え/解決策はすべて同じです。内部クエリに列名がありませんでした。この可能性のある重複を参照してください。 '** tbl' **の列1に列名が指定されていません(https://stackoverflow.com/questions/31000895/no-column-name-was-specified-for-column- 1-of-tbl)を示す。 – Nope

答えて

3

COUNT計算が適用されている列に名前を指定する必要があります。

SELECT COUNT(*) FROM (
    SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) Count 
    FROM [Laola].[AGG_0] 
    GROUP BY Platform, DeviceCategory 
    UNION 
    SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) 
    FROM [Laola].[AGG_2] 
    GROUP BY Platform, DeviceCategory 
) x 
2

あなたは3列に別名を与える必要があります。

SELECT COUNT(*) FROM (
    SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) As Count 
    FROM [Laola].[AGG_0] 
    GROUP BY Platform, DeviceCategory 
    UNION 
    SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) As Count 
    FROM [Laola].[AGG_2] 
    GROUP BY Platform, DeviceCategory 
) x 
+0

2番目のサブクエリのカウントにエイリアスは必要ありません。 –

+3

@TimBiegeleisen技術的には、あなたは正しいです。しかし、それはいつも両側をエイリアスするだけの個人的な習慣です。 – Siyual

1

あなただけのエイリアスを必要とします列:

SELECT COUNT(*) 
FROM (
     SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) as nr 
     FROM [Laola].[AGG_0] 
     GROUP BY Platform, DeviceCategory 
     UNION 
     SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) 
     FROM [Laola].[AGG_2] 
     GROUP BY Platform, DeviceCategory 
    ) x 
+1

2番目のサブクエリのカウントにエイリアスは必要ありません。 –

+0

ハハ!はい、確かに、習慣から外れています。編集されました! –

1

UNIONクエリを実行しないでください!重複を取り除きます。 UNION ALLを使用してください。

以下は、行数と各テーブルからのユニークカウントの合計を与える:

SELECT COUNT(*), SUM(cnt) 
FROM ((SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) as cnt 
     FROM [Laola].[AGG_0] 
     GROUP BY Platform, DeviceCategory 
    ) UNION ALL 
     (SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) as cnt 
     FROM [Laola].[AGG_2] 
     GROUP BY Platform, DeviceCategory 
    ) 
    ) x; 

あなたがCOUNT(DISTINCT)を使用していない場合は、サブクエリから削除します。オーバーヘッドが発生し、オプティマイザがそれを削除することを100%保証しているわけではありません。精度、簡潔、かつ効率の観点から

は、私が推薦する:

SELECT COUNT(*) 
FROM ((SELECT DISTINCT Platform, DeviceCategory 
     FROM [Laola].[AGG_0] 
    ) UNION ALL 
     (SELECT DISTINCT Platform, DeviceCategory 
     FROM [Laola].[AGG_2] 
    ) 
    ) x; 
+0

ありがとうございます。 2つの結果セットが等しいかどうかを確認するために 'UNION'クエリを使用しました。私が' UNION'を使用した後、2つのテーブルのいずれよりも大きい 'count 'を得ると、それらは同じデータを持たないことを意味します。それが私がUNIONを使用した理由です。 –

+0

@ Alexandru-IonutMihai。 。 。それは 'UNION'の誤用です。代わりに 'FULL OUTER JOIN'のようなものを使うべきです。おそらく、あなたの目標を達成する最善の方法について別の質問をするべきでしょう。そして、もしあなたがダウンボートなら、私はこのケースでは失礼だと考えます。 –

+0

いいえ、私はあなたが答えを投稿するときにあなたを支持しました。 –

関連する問題