2013-07-16 19 views
6

データベース内のさまざまなテーブルで多数のカウントを実行する必要があります。
これらのカウントを1つの結果にまとめたいと思います。行ではなく列として複数の結果を結合する

SELECT 100 As SomeCount 
UNION 
SELECT 200 As SomeOtherCount 
UNION 
SELECT 300 As YetAnotherCount 

出力:

> SomeCount 
> --------- 
> 100 
> 200 
> 300 
私は UNIONを使用してそれらを組み合わせた場合、結果のそれぞれは、最終結果の行になります

SELECT 100 As SomeCount 
SELECT 200 As SomeOtherCount 
SELECT 300 As YetAnotherCount 

:次のクエリConider

私が代わりにしたいのは

> SomeCount | SomeOtherCount | YetAnotherCount 
> -------------------------------------------- 
> 100  |  200  |  300 

私は結果がこのような何か使用している「名前」を切ったと思うことができる唯一の他の方法:

>  Name   |  Value 
> --------------------------------- 
> 'SomeCount'  |  100 
> 'SomeOtherCount' |  200 
> 'YetAnotherCount' |  300 

があります:のように結果が見え

SELECT 'SomeCount' As Name, 100 As Value 
UNION ALL 
SELECT 'SomeOtherCount', 200 
UNION ALL 
SELECT 'YetAnotherCount', 300 

た場合を私が望む結果を得る方法、 または行く方法の最後の方法ですか?

上記のクエリは、コアの問題を説明するために非常に簡単であることを言及する必要があります。 現実に組み合わせる必要が2つのクエリは次のようになります。

クエリ1:

SELECT Count(Id) As UndeliveredSms 
FROM 
(
SELECT Id 
FROM IncomingSms 
WHERE Id NOT IN (SELECT IncomingSmsId 
        FROM DeliveryAttempt 
        WHERE Status = 'Delivered' OR Status = 'FailedPermanently') 
) 

クエリ2:

SELECT Count(Id) As UndeliveredEMail FROM 
(
SELECT Id 
FROM IncomingEMail 
WHERE Id NOT IN (SELECT IncomingEMailId 
        FROM DeliveryAttempt 
        WHERE Status = 'Delivered' OR Status = 'FailedPermanently') 
) 

は別のSELECT文でこれらのラッピングは、SQLiteのでは動作しません。 。例の最後のメソッドを使用して

は仕事をし、そしてそれは悪い考えでない限り、私はそのソリューションで を行くかもしれない:

>  Name   |  Value 
> --------------------------------- 
> UndeliveredEMail |  82 
> UndeliveredSms  |  0 

そして、このような何かになり

SELECT 'UndeliveredSms' As Name, Count(Id) As Value 
FROM 
(
SELECT Id 
FROM IncomingSms 
WHERE Id NOT IN (SELECT IncomingSmsId 
        FROM DeliveryAttempt 
        WHERE Status = 'Delivered' OR Status = 'FailedPermanently') 
) 

UNION 

SELECT 'UndeliveredEMail', Count(Id) FROM 
(
SELECT Id 
FROM IncomingEMail 
WHERE Id NOT IN (SELECT IncomingEMailId 
        FROM DeliveryAttempt 
        WHERE Status = 'Delivered' OR Status = 'FailedPermanently') 
) 

実際には、実際にはさらに多くのものがあります。

答えて

4

クエリ間にCROSS JOINを使用できるようにする必要があります。

SELECT * 
FROM 
(
    SELECT Count(Id) As UndeliveredSms 
    FROM 
    (
    SELECT Id 
    FROM IncomingSms 
    WHERE Id NOT IN (SELECT IncomingSmsId 
        FROM DeliveryAttempt 
        WHERE Status = 'Delivered' OR Status = 'FailedPermanently') 
) 
) 
CROSS JOIN 
(
    SELECT Count(Id) As UndeliveredEMail FROM 
    (
    SELECT Id 
    FROM IncomingEMail 
    WHERE Id NOT IN (SELECT IncomingEMailId 
        FROM DeliveryAttempt 
        WHERE Status = 'Delivered' OR Status = 'FailedPermanently') 
) 
); 

SQL Fiddle with Demo

+0

ありがとう、あなたは歓迎されている@TimothyPことが – TimothyP

+0

:-)私の問題を解決します! – Taryn

+1

この場合、連合は必要ですか? 2つのクエリの性質を考慮せずに動作するように見えます:http://sqlfiddle.com/#!7/f8ac1/6 – user2480596

1

を参照してください。私はあなたのクエリでUNIONの使用を理解していない、おそらく私は誤解です。サブセットではありませんすべてではない=サブセットにない...

は、それが次のように単純化することができるように思える:

select * 
from 
(
    SELECT Count(Id) As UndeliveredSms 
    FROM IncomingSms 
    WHERE Id NOT IN (SELECT IncomingSmsId 
        FROM DeliveryAttempt 
        WHERE Status = 'Delivered' OR Status = 'FailedPermanently') 
) t, 
(
    SELECT Count(Id) As UndeliveredEMail 
    FROM IncomingEMail 
    WHERE Id NOT IN (SELECT IncomingEMailId 
        FROM DeliveryAttempt 
        WHERE Status = 'Delivered' OR Status = 'FailedPermanently') 
) t2 
+0

実際にあなたが正しいかもしれない、私は前にそれを別々に解決しようとしていたに違いない。私はそれを見て、いいキャッチ! – TimothyP

+0

@TimothyP - np - これが助けて欲しい。 Bluefeetが正しい答えを提供しました - これはちょっとしたメモでした:)乾杯! – user2480596

関連する問題