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


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

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

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

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

1
Ini persis apa yang saya inginkan, tetapi tidak tahu bagaimana mencarinya. Saya tidak berpikir untuk menggunakan SUM (CASE) - terima kasih.
sylverfyre

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.