GABUNG dua hasil pernyataan SELECT

174

Apakah mungkin untuk menggabungkan hasil dari 2 SELECTpernyataan sql dalam satu pernyataan? Saya memiliki basis data tugas di mana setiap catatan adalah tugas yang terpisah, dengan tenggat waktu (dan PALT, yang hanya beberapa INThari dari awal hingga tenggat waktu. AgeJuga merupakan INTbeberapa hari.)

Saya ingin memiliki tabel yang memiliki masing-masing orang dalam tabel, jumlah tugas yang mereka miliki, dan jumlah LATEtugas yang mereka miliki (jika ada.)

Saya bisa mendapatkan data ini dalam tabel terpisah dengan mudah, seperti:

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

mengembalikan data seperti:

ks        # Tasks
person1   7
person2   3

dan kemudian saya memiliki:

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

yang mengembalikan:

ks        # Late
person1   1
person2   1

Dan saya ingin bergabung dengan hasil dari dua selectpernyataan ini (oleh KS)

Saya mencoba untuk menghindari menggunakan tabel temp, tetapi jika itu satu-satunya cara praktis untuk melakukan ini, saya ingin tahu lebih banyak tentang menggunakan tabel temp dalam mode ini.

Saya juga mencoba melakukan beberapa count()baris yang memenuhi syarat, tetapi saya juga tidak tahu bagaimana melakukannya. Jika mungkin, itu akan berhasil juga.

Addendum: Maaf, saya ingin hasil saya memiliki kolom untuk KS, Tasks, danLate

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

Selain itu, saya ingin seseorang muncul bahkan jika mereka tidak memiliki tugas terlambat.

SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END) Late
berfungsi dengan baik, terima kasih atas jawaban ini!

Dua pernyataan pilih juga berfungsi, menggunakan a LEFT JOINuntuk bergabung juga berfungsi, dan saya mengerti sekarang bagaimana cara menggabungkan beberapa selects dengan cara ini

sylverfyre
sumber
Anda belum memberikan contoh hasil yang diharapkan. Karena itu beberapa jawaban merupakan hasil gabungan. Beberapa bergabung. Yang mana yang kamu mau?
Phil
Maaf, saya ingin hasil saya memiliki kolom untuk KS, Tugas, dan KS Terlambat # Tugas # Terlambat orang1 7 1 orang2 3 1 orang3 2 0 (atau nol) Selain itu, saya ingin seseorang muncul meskipun mereka tidak memiliki tugas yang terlambat . Saat ini mencapai ini menggunakan dua metode pernyataan pilih dengan BERGABUNG KIRI (yang bertentangan dengan INNER BERGABUNG, yang bekerja tetapi tidak menunjukkan orang-orang tanpa tugas akhir karena mereka tidak ada di SELECT kedua. Juga mencapai ini dengan yang terlambat kolom sedang SUM (KASUS KETIKA Umur> Palt THEN 1 ELSE 0 END) Late
sylverfyre

Jawaban:

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);
Phil
sumber
1
Ini bekerja dengan baik, meskipun saya tidak menentukan bahwa saya ingin GABUNG KIRI sehingga catatan muncul bahkan jika mereka memiliki 0 tugas terlambat.
sylverfyre
Menerima jawaban ini karena menjawab pertanyaan yang saya ajukan terbaik, dan itu diformat menjadi referensi yang bagus untuk bergabung dengan pernyataan SELECT :)
sylverfyre
Jawaban yang sangat bagus, tetapi bisakah seseorang mengatakan apakah jenis 'solusi' ini dianggap mahal atau hanya bergantung pada apa Anda menggunakannya?
petrosmm
71

Coba sesuatu seperti ini:

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
Mithrandir
sumber
4
Saya tidak bisa mendapatkan jawaban yang diterima untuk bekerja, tetapi ini bekerja dengan baik untuk kebutuhan saya. Terima kasih.
benvenker
Bekerja seperti pesona. Sejauh yang saya ketahui ini harus menjadi jawaban yang diterima. Terima kasih.
nocdib
Bekerja untukku! Terima kasih! Saya juga mencoba menggunakan beberapa querys (beberapa Joins) dan juga bagus sekali. Jika seseorang bertanya-tanya Anda bisa menambahkan lebih banyak GABUNGAN setelah "ON" terakhir dalam contoh, dan tetap menggunakan urutan: ON .... X BERGABUNG (QUERY N -1) ON Y = ZX GABUNG (QUERY N) ON Y = Z
cesarmart
43

Gunakan 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

Atau UNION ALLjika Anda ingin duplikat:

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
aF.
sumber
3
Union atau Union All hanya akan memiliki 2 kolom dalam hasil. Dimana dia mau 3 dari mereka
Suraj
14

Jika Usia dan Palt adalah kolom dalam Tabel yang sama, Anda dapat menghitung (*) semua tugas dan menjumlahkan hanya tugas yang terlambat seperti ini:

select ks,
       count(*) tasks,
       sum(case when Age > Palt then 1 end) late
  from Table
 group by ks
Nikola Markovinović
sumber
1
Ini persis apa yang saya inginkan, tetapi tidak tahu bagaimana mencarinya. Saya tidak berpikir untuk menggunakan SUM (CASE) - terima kasih.
sylverfyre