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


174

2つのSQL SELECTステートメントの結果を1つのステートメントに結合することはできますか?タスクのデータベースがあり、各レコードは個別のタスクであり、期限が設定されています(および、開始から期限までの日数 PALTであるa も日数です)。INTAgeINT

テーブルに各人がいるテーブル、彼らが持っているタスクの数、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

そして、私はこれらの2つのselectステートメントの結果を結合したいです(KS

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

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

補遺:申し訳ありませんが、私は私の結果はの列を持つようにしたいKSTasksと、Late

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

また、遅い仕事がなくても出てもらいたいです。

SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END) Late
この回答に感謝します!

2つのselectステートメントも機能し、a LEFT JOINを使用してそれらを結合することもできます。selectこの方法で複数のを結合する方法を理解しました


期待される結果の例を示していません。したがって、いくつかの答えは結果を連結したものです。一部は参加しています。あなたはどれが欲しいですか?
フィル

結果にKS、タスク、および後期KSの列が含まれるようにしたい#タスク#後期人1 7 1人2 3 1人3 2 0(またはnull)さらに、後期タスクがない場合でも表示されるようにしたい。現在、LEFT JOINで2つのSELECTステートメントメソッドを使用してこれを実現しています(推奨されているINNER JOINとは対照的です。これは機能しますが、2番目のSELECTに存在しないため、レイトタスクがない人は表示されません)カラムはSUMです(CASE WHEN年齢>
Palt

回答:


264
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);

1
これはうまく機能しますが、レイトタスクが0の場合でもレコードが表示されるようにLEFT JOINが必要であると指定していません。
sylverfyre

この回答は、私が最もよく尋ねた質問に答え、SELECTステートメントの結合に関する優れたリファレンスになるようにフォーマットされているため、受け入れられました:)
sylverfyre

素晴らしい答えですが、誰かがこのタイプの「解決策」は高価であると考えられているのか、それともあなたがそれを何に使用しているのかに依存していると言えるでしょうか?
ペトロスム

71

次のようなものを試してください:

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

4
受け入れられた答えを得ることができませんでしたが、これは私のニーズにうまく働きました。ありがとう。
benvenker

魅力のように働いた。私に関する限り、これは受け入れられる答えであるはずです。ありがとう。
nocdib

私のために働いた!ありがとう!また、複数のクエリ(複数の結合)を使用してみましたが、これも非常に便利です。誰かが疑問に思っている場合は、例の最後の "ON"の後にJOINを追加し、シーケンスを使用し続けることができます:ON .... X JOIN(QUERY N -1)ON Y = ZX JOIN(QUERY N)ON Y = Z
cesarmart 2019

43

使用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

3
UnionまたはUnion Allの結果は2列のみになります。彼が望んでいるのはそのうちの3つ
SurajS 2017年

14

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

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

1
これはまさに私が欲しかったものですが、それを探す方法がわかりませんでした。SUM(CASE)の使用は考えていませんでした。
sylverfyre

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.