เข้าร่วมสองคำสั่ง SELECT ผลลัพธ์


174

เป็นไปได้หรือไม่ที่จะเข้าร่วมผลลัพธ์ของSELECTข้อความสั่ง2 sql ในข้อความเดียว? ฉันมีฐานข้อมูลของงานที่แต่ละระเบียนเป็นงานแยกต่างหากพร้อมกำหนดเวลา (และ a 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)

ฉันกำลังพยายามหลีกเลี่ยงการใช้ตาราง temp แต่ถ้าเป็นวิธีเดียวที่ทำได้จริงฉันต้องการทราบเพิ่มเติมเกี่ยวกับการใช้ตาราง temp ในแบบนี้

ฉันยังพยายามทำ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
ทำงานได้ดีขอบคุณสำหรับคำตอบนี้!

ข้อความสองข้อที่เลือกใช้งานได้เช่นกันการใช้ a LEFT JOINเพื่อเข้าร่วมยังทำงานได้และตอนนี้ฉันเข้าใจแล้วว่าจะเข้าร่วมหลายรายการselectในรูปแบบนี้ได้อย่างไร


คุณยังไม่ได้รับตัวอย่างของผลลัพธ์ที่คาดหวัง คำตอบบางคำจึงเป็นผลลัพธ์ที่เชื่อมโยงกัน บางคนกำลังเข้าร่วม คุณต้องการแบบไหน
Phil

ขออภัยฉันต้องการให้ผลลัพธ์ของฉันมีคอลัมน์สำหรับ KS, Tasks และ Late KS # Tasks # Late person1 7 1 คน 2 3 1 คน 3 2 0 (หรือ null) นอกจากนี้ฉันต้องการคนที่จะแสดงขึ้นแม้ว่าพวกเขาจะไม่มีงานล่าช้า . ขณะนี้การบรรลุผลโดยใช้วิธีการเลือกสองคำสั่งด้วย LEFT JOIN (ตรงข้ามกับ INNER JOIN ที่แนะนำซึ่งใช้งานได้ แต่ไม่แสดงบุคคลที่ไม่มีงานล่าช้าเพราะพวกเขาไม่มีอยู่ใน SELECT ที่สอง คอลัมน์เป็น SUM (กรณีที่อายุ> Palt แล้ว 1 ELSE 0 END) ปลาย
sylverfyre

คำตอบ:


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
มันใช้งานได้ดีแม้ว่าฉันไม่ได้ระบุว่าฉันต้องการ LEFT JOIN เพื่อให้บันทึกปรากฏแม้ว่าพวกเขาจะมีงานที่ล่าช้า 0
sylverfyre

ได้รับการยืนยันคำตอบนี้เพราะมันตอบคำถามผมถามที่ดีที่สุดและจะจัดรูปแบบจะมีการอ้างอิงที่ดีในการเข้าร่วมงบ SELECT :)
sylverfyre

คำตอบที่ยอดเยี่ยม แต่ใครบางคนสามารถบอกได้ว่า 'โซลูชัน' ประเภทนี้มีราคาแพงหรือขึ้นอยู่กับสิ่งที่คุณใช้งานอยู่
petrosmm

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
ฉันไม่สามารถรับคำตอบที่ได้รับการยอมรับ แต่มันก็ใช้ได้ดีสำหรับความต้องการของฉัน ขอบคุณ
benvenker

ทำงานเหมือนจับใจ เท่าที่ฉันกังวลนี้ควรเป็นคำตอบที่ยอมรับ ขอบคุณ
nocdib

ทำงานให้ฉัน! ขอบคุณ! ฉันยังลองใช้การสืบค้นหลายรายการ (การรวมหลายรายการ) และมันก็ยอดเยี่ยมด้วย หากมีคนสงสัยว่าคุณสามารถเพิ่ม JOIN ได้มากขึ้นหลังจากตัวอย่าง "ON" สุดท้ายและใช้ลำดับ: ON .... X เข้าร่วม (QUERY N -1) ON Y = ZX เข้าร่วม (QUERY N) ON Y = Z
cesarmart

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
Union หรือ Union All จะมี 2 คอลัมน์ในผลลัพธ์ ที่ไหนที่เขาต้องการ 3 ของพวกเขา
SurajS

14

หาก Age และ Palt เป็นคอลัมน์ในตารางเดียวกันคุณสามารถนับ (*) งานทั้งหมดและรวมเฉพาะงานล่าช้าเช่นนี้:

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

1
นี่คือสิ่งที่ฉันต้องการอย่างแน่นอน แต่ไม่รู้ว่าจะมองมันอย่างไร ฉันไม่คิดว่าจะใช้ SUM (CASE) - ขอบคุณ
sylverfyre

13

คุณสามารถใช้UNION ALLคำสำคัญสำหรับสิ่งนี้

นี่คือเอกสาร MSDN ที่ต้องทำใน T-SQL http://msdn.microsoft.com/en-us/library/ms180026.aspx

UNION ALL - รวมชุดผลลัพธ์

ยูเนี่ยน - ทำบางสิ่งเช่น Set Union และไม่ส่งค่าที่ซ้ำกัน

สำหรับความแตกต่างกับตัวอย่าง: http://sql-plsql.blogspot.in/2010/05/difference-between-union-union-all.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.