2012-05-10 15 views
98

Bir ifade içinde 2 sql SELECT ifadelerinin sonuçlarına katılmak mümkün müdür? Her bir kaydın ayrı bir görev olduğunu ve son tarihlerle birlikte (ve bir PALT, başlangıçtan son güne kadar bir INT olan bir PALT var. Görevler aynı zamanda günlerin bir INT sayısıdır.)JOIN iki SELECT deyim sonuçları

Tablodaki her bir kişi, sahip oldukları görevlerin sayısı ve sahip oldukları görevlerin sayısı (varsa) olan bir tabloya sahip olmak

Bu verileri aşağıdaki gibi kolayca tablolara alabilirim:

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

dönen veriler gibi:

ks  # Tasks 
person1 7 
person2 3 

ve sonra döndürür

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

var:

ks  # Late 
person1 1 
person2 1 

Ve (KS tarafından) deniyorum

bu iki seçkin tabloların sonuçlarını katılmak istiyorum geçici tablo kullanmaktan kaçının, ancak bunu yapmanın tek pratik yolu buysa, temp tablolarını bu şekilde kullanmak hakkında daha fazla bilgi edinmek istiyorum.

Ayrıca, koşullu koşulları karşılayan bir tür sayım() sayısı denemeye çalıştım, ancak bunu nasıl yapacağımı da anlayamadım. Mümkünse, bu da işe yarayacaktı.

Zeyilname: Üzgünüm, benim sonuçlar KS, Görevler için sütunlar sahip olmak istiyorum ve

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

Geç Ayrıca, onlar hiç geç görevleri olmasa bile bir kişinin göstermek istiyorum.

SUM (VAKA Yaşı> Palt SONRA ELSE 0 SON) Geç iyi çalışıyor, bu cevap için teşekkürler!

İki select deyimi de çalışır, bunlara katılmak için bir SOL JOIN kullanarak çalışır ve şimdi bu şekilde birden çok seçime nasıl katılacağını anlıyorum. Teşekkürler!

+0

beklenen sonucun örneği. Bazı cevaplar bu nedenle sonuçları birleştiriyor. Bazıları katılıyor. Hangisini istersin? – Phil

+0

Üzgünüm, sonuç KS, Görevler için sütunlar sahip olmak istiyorum ve person1 7 1 PERSON2 3 1 person3 2 0 Geç (veya null) Geç KS # Görevler # Ayrıca, ben göstermek için bir kişiyi istiyor Geç görevleri olmayan bile. Şu anda bu iki LETT JOIN ile bir deyim yöntemi kullanarak elde etmek (önerilen INNER JOIN, aksine çalışır, ancak onlar değil, ikinci SELECT 0 SELECT içinde var olmadıkları için geç görevleri olmayan Bu, SUM olan bir sonraki sütun ile (YAŞINDAKİ DURUMU Yaş> Palt THEN 1 ELSE 0 END) Geç – sylverfyre

cevap

167
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 SOL JOIN istediğimi belirtmedim, böylece kayıtlar 0 geç görevleri olsa bile görünür – sylverfyre

+0

Bu cevabı kabul ettim çünkü en iyi sorduğum soruya cevap veriyor ve JOINING SELECT ifadelerinde büyük bir referans olması için biçimlendiriliyor :) – sylverfyre

41

böyle 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 
+0

İşe kabul edilen yanıtı alamadım, ancak bu ihtiyaçlar için çok işe yaradı. Teşekkürler. – benvenker

27

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 

Ya UNION ALL Eğer çiftleri istiyorsanız: Yaş ve Palt sütunlar aynı Tablo iseniz, (*) güvenebilirsiniz

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 
+0

Birlik veya Birlik Tümünde sonuçta yalnızca 2 sütun olacak. Nerede 3 istediği gibi – SurajS

11

tüm görevleri ve bunun gibi yalnızca geç olanlar:

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

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

+0

Rica ederim :-) –