दो चयनित बयान परिणामों में शामिल हों


174

क्या SELECTएक कथन में 2 sql कथनों के परिणामों में शामिल होना संभव है ? मेरे पास ऐसे कार्यों का एक डेटाबेस है जहां प्रत्येक रिकॉर्ड एक अलग कार्य है, जिसकी समय सीमा (और PALT, जो कि INTसमय सीमा से कुछ दिनों तक है। Ageयह भी कई INTदिनों का है।)

मैं एक तालिका रखना चाहता हूं जिसमें प्रत्येक व्यक्ति की तालिका हो, उनके पास जितने 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

और मैं इन दोनों selectकथनों के परिणामों में शामिल होना चाहता हूं (द्वारा KS)

मैं एक अस्थायी तालिका का उपयोग करने से बचने की कोशिश कर रहा हूं, लेकिन अगर ऐसा करने का एकमात्र व्यावहारिक तरीका है, तो मैं इस तरह से टेम्‍प टेबल का उपयोग करने के बारे में अधिक जानना चाहूंगा।

मैंने कुछ प्रकार की count()पंक्तियों को करने की भी कोशिश की , जो एक सशर्त को संतुष्ट करती है, लेकिन मैं यह पता नहीं लगा सका कि यह कैसे करना है। यदि यह संभव है, तो वह भी काम करेगा।

परिशिष्ट: क्षमा करें, मैं चाहता हूँ मेरे परिणाम के कॉलम हैं, करने के लिए KS, Tasksऔर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
अच्छी तरह से काम करता है, इस उत्तर के लिए धन्यवाद!

दो चुनिंदा कथन भी काम करते हैं, LEFT JOINउनमें शामिल होने के लिए ए का उपयोग भी काम करता है, और मैं अब समझता हूं कि selectइस फैशन में कई एस कैसे जुड़ना है


आपने अपेक्षित परिणाम का उदाहरण नहीं दिया है। कुछ जवाब इसलिए नतीजे देने वाले हैं। कुछ शामिल हो रहे हैं। आप कौन सा चाहते है?
फिल

क्षमा करें, मैं चाहता हूं कि मेरे परिणाम केएस, टास्क और लेट केएस के लिए कॉलम हों। # टास्क # लेट पर्सन 1 7 1 व्यक्ति 2 3 1 व्यक्ति 3 2 0 (या अशक्त) इसके अलावा, मैं चाहता हूं कि कोई व्यक्ति दिखाई दे, भले ही उनके पास देर से कार्य न हों । वर्तमान में एक LEFT JOIN के साथ दो चुनिंदा स्टेटमेंट मेथड का उपयोग करके इसे प्राप्त करना (जैसा कि सुझाए गए INNER JOIN के विपरीत है, जो काम करता है, लेकिन बिना किसी देरी के काम करने वाले व्यक्तियों को नहीं दिखाता है, क्योंकि वे दूसरे SELECT में मौजूद नहीं हैं, यह देर से प्राप्त करना भी है। कॉलम SUM (CASE WHEN Age> Palt THEN 1 ELSE 0 END) लेट
सिल्वरफेयर

जवाबों:


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 लेट कार्य हों।
सिल्वेरीफ़ायर

इस उत्तर को स्वीकार कर लिया क्योंकि यह मेरे द्वारा पूछे गए प्रश्न का उत्तर देता है, और यह चयन के वक्तव्यों पर एक महान संदर्भ के रूप में स्वरूपित किया गया है :)
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
मुझे काम करने के लिए स्वीकृत उत्तर नहीं मिला, लेकिन इसने मेरी जरूरतों के लिए बहुत अच्छा काम किया। धन्यवाद।
बेवेनकर

एक जादू की तरह काम किया। जहां तक ​​मेरा सवाल है यह स्वीकृत जवाब होना चाहिए। धन्यवाद।
nocdib

मेरे लिए काम किया! धन्यवाद! मैंने कई क्वेरी (मल्टीपल जॉइंट्स) का उपयोग करने की भी कोशिश की और यह भी बढ़िया है। अगर कोई सोच रहा है कि आप उदाहरण में अंतिम "ON" के बाद और अधिक JOIN जोड़ सकते हैं, और क्रम का उपयोग करते रहेंगे: ON .... X JOIN (QUERY N -1) ON Y = ZX JOIN (QUERY N) ON = Z
सेसमार्ट

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
संघ या संघ सभी के परिणाम में केवल 2 कॉलम होंगे। जहाँ वह उनमें से 3 को चाहता है
सूरज

14

यदि आयु और पाल्ट एक ही तालिका में कॉलम हैं, तो आप सभी कार्यों को (*) गिन सकते हैं और केवल देर से आने वाले लोगों को इस तरह से जोड़ सकते हैं:

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

1
यह वही है जो मैं चाहता था, लेकिन यह नहीं पता था कि यह कैसे दिखता है। मैंने एक SUM (CASE) का उपयोग करने के बारे में नहीं सोचा था - धन्यवाद।
सिल्वरफ़ेयर

13

आप उपयोग कर सकते हैं UNION ALL कीवर्ड का ।

यहाँ टी-एसक्यूएल में ऐसा करने के लिए MSDN डॉक है http://msdn.microsoft.com/en-us/library/ms180026.aspx

यूनिअन ऑल - परिणाम सेट को जोड़ती है

यूनिअन- सेट यूनियन की तरह कुछ करता है और डुप्लिकेट आउटपुट डुप्लिकेट वैल्यूज़ नहीं करता है

एक उदाहरण के साथ अंतर के लिए: http://sql-plsql.blogspot.in/2010/05/difference-between-union-union-all.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.