web-dev-qa-db-ja.com

2つのSELECTステートメントの結果を結合する

2つのSQL SELECTステートメントの結果を1つのステートメントに結合することは可能ですか?私は、各レコードが期限付きの別々のタスクであるタスクのデータベースを持っています(そしてPALTは開始から期限までの日数のINTです。年齢もINTの日数です)。

私は、テーブルの中にそれぞれの人がいるテーブル、彼らが持っているタスクの数、そして彼らが持っているLATEタスクの数(もしあれば)を持ちたいです。

このように、このデータを別々のテーブルに簡単に入れることができます。

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks

のようなデータを返す:

ks        # Tasks
person1   7
person2   3

そして私は

SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

これは

ks        # Late
person1   1
person2   1

そして、私はこれら二つのselectステートメントの結果に参加したい(KSによる)

一時テーブルの使用を避けようとしていますが、これが唯一の実用的な方法である場合は、この方法で一時テーブルを使用する方法について詳しく知りたいと思います。

私はまた、条件を満足するようなcount()#行の数種類を行おうとしましたが、その方法もわかりませんでした。可能であれば、それも機能します。

補遺:申し訳ありませんが、私の結果にKS、Tasks、およびLateの列を含めるようにしたいです。

KS        # Tasks   # Late
person1   7         1
person2   3         1
person3   2         0  (or null)

さらに、遅いタスクがなくても出てくる人が欲しいのです。

SUM(年齢> Palt 1 ELSE 0 ENDの場合は大文字、小文字)この回答をお寄せいただきありがとうございます。

2つのSELECTステートメントも機能します。それらを結合するためにLEFT JOINを使用しても機能します。この方法で複数の選択を結合する方法を理解しました。ありがとうございます。

138
sylverfyre
SELECT t1.ks, t1.[# Tasks], COALESCE(t2.[# Late], 0) AS [# Late]
FROM 
    (SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1
LEFT JOIN
    (SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON (t1.ks = t2.ks);
213
Phil

このようなことを試してください:

SELECT 
* 
FROM
(SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1 
INNER JOIN
(SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON t1.ks = t2.ks
51
Mithrandir

UNIONを使う:

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

重複したい場合はUNION ALL

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION ALL
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks
32
aF.

これにはUNION ALLキーワードを使用できます。

これはT-SQLでそれを行うためのMSDNのドキュメントです http://msdn.Microsoft.com/en-us/library/ms180026.aspx

UNION ALL - 結果セットを結合します

UNION - Set Unionのようなことをし、重複した値を出力しません

例との違いは: http://sql-plsql.blogspot.in/2010/05/difference-between-union-union-all.html

13
Baz1nga

AgeとPaltが同じTable内の列である場合は、すべてのタスクをカウント(*)して、次のように遅いタスクのみを合計できます。

select ks,
       count(*) tasks,
       sum(case when Age > Palt then 1 end) late
  from Table
 group by ks
13