İki SELECT deyimi sonucuna katıl


174

SELECTBir ifadede 2 sql ifadesinin sonuçlarına katılmak mümkün müdür ? Bir süreler her kayıt ayrı bir iştir görevlerin veri tabanına sahip (ve bir PALTsadece bir olduğunu, INTbaştan tarihine kadar gün. AgeAyrıca bir olan INTgün sayısı.)

Tabloda her bir kişi, sahip oldukları görev sayısı ve LATEsahip oldukları görev sayısı (varsa) olan bir tablo istiyorum .

Bu verileri ayrı tablolarda kolayca alabilirsiniz, şöyle:

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

gibi veri döndürme:

ks        # Tasks
person1   7
person2   3

ve sonra bende:

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

döndüren:

ks        # Late
person1   1
person2   1

Ve bu iki sonuçlarını katılmak istiyorum select(açıklamalarına KS)

Bir geçici tablo kullanmaktan kaçınmaya çalışıyorum, ancak bunu yapmanın tek pratik yolu ise, bu şekilde geçici tabloları kullanma hakkında daha fazla bilgi edinmek istiyorum.

Ayrıca count()bir şartı yerine getiren bir tür satır yapmaya çalıştım , ama bunu nasıl yapacağımı da anlayamadım. Mümkünse, bu da işe yarardı.

Ek: Üzgünüm, benim sonuçlar sütunları için sahip olmak istiyorum KS, TasksveLate

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

Ek olarak, bir kişinin geç görevleri olmasa bile görünmesini istiyorum.

SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END) Late
iyi çalışıyor, bu cevap için teşekkürler!

İki select deyimi de çalışır, LEFT JOINonlara katılmak için a'yı kullanmak da işe yarar ve şimdi selectbu şekilde birden çok s'ye nasıl katılacağımı anlıyorum


Beklenen sonuca bir örnek vermediniz. Bu nedenle bazı cevaplar sonuçları birleştiriyor. Bazıları katılıyor. Hangisini istersin?
Phil

Maalesef, sonuçlarımın KS, Görevler ve Geç KS için sütunlar olmasını istiyorum # Görevler # Geç kişi1 7 1 kişi2 3 1 kişi3 2 0 (veya null) Ayrıca, geç görevleri olmasa bile bir kişinin görünmesini istiyorum . Şu anda bir LEFT JOIN ile iki select deyimi yöntemini kullanarak bunu başarıyor (önerilen INNER JOIN'in aksine, çalışan ancak geç görevleri olmayan kişileri ikinci SEÇİM'de bulunmadığı için gösterme Ayrıca bunu geç sütun TOPLA (VARSA> DURUM> SONRA 1 ELSE 0 END) Geç
sylverfyre

Yanıtlar:


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
Bu, iyi çalışır, ancak bir LEFT JOIN istediğimi belirtmedim, böylece 0 geç görev olsa bile kayıtların görünmesi.
sylverfyre

Bu yanıtı kabul ettim, çünkü en iyi sorduğum soruya cevap veriyor ve SELECT ifadelerine katılmak için büyük bir referans olacak şekilde biçimlendirildi :)
sylverfyre

Mükemmel cevap, ancak birisi bu tür bir 'çözüm' pahalı olarak kabul edilebilir mi yoksa sadece ne için kullandığınıza bağlıdır?
petrosmm

71

Bunun gibi bir şey deneyin:

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
Kabul edilen cevabı işe alamadım, ama bu benim ihtiyaçlarım için harika çalıştı. Teşekkürler.
benvenker

Bir cazibe gibi çalıştı. Bence bu kabul edilen cevap olmalı. Teşekkürler.
nocdib

Benim için çalıştı! Teşekkürler! Ayrıca birden çok querys (birden çok katıldı) kullanarak denedim ve aynı zamanda harika woks. Birisi merak ediyorsanız sadece örnekteki son "AÇIK" dan sonra daha fazla JOIN ekleyebilir ve sıralamayı kullanmaya devam edebilirsiniz: ON .... X JOIN (QUERY N -1) ON Y = ZX JOIN (QUERY N) ON Y = Z
cesarmart

43

Kullanım 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

Veya UNION ALLkopyalar istiyorsanız:

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
Birlik veya Birlik Tümü sonuçta yalnızca 2 sütuna sahip olacaktır. Nerede o 3 tanesini istediği
SurajS

14

Yaş ve Palt aynı Tablodaki sütunlarsa, tüm görevleri sayabilir (*) ve yalnızca bunun gibi geç olanları toplayabilirsiniz:

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

1
Bu tam istediğim, ama nasıl aradığını bilmiyordum. SUM (CASE) kullanmayı düşünmedim - teşekkürler.
sylverfyre

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.