2012-05-10 77 views
98

Có thể kết hợp các kết quả của câu lệnh SELECT 2 sql trong một câu lệnh không? Tôi có một cơ sở dữ liệu các nhiệm vụ mà mỗi bản ghi là một nhiệm vụ riêng biệt, với thời hạn (và một PALT, chỉ là INT trong ngày kể từ ngày bắt đầu đến hạn. Tuổi cũng là INT số ngày.)JOIN hai kết quả câu lệnh SELECT

Tôi muốn để có một bảng có mỗi người trong bảng, số nhiệm vụ họ có và số nhiệm vụ LATE họ có (nếu có.)

Tôi có thể lấy dữ liệu này trong các bảng riêng biệt một cách dễ dàng, như vậy:

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

dữ liệu trở lại như:

ks  # Tasks 
person1 7 
person2 3 

và sau đó tôi có

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

trả về:

ks  # Late 
person1 1 
person2 1 

Và tôi muốn tham gia các kết quả của hai câu chọn (bởi KS)

Tôi đang cố gắng để tránh sử dụng một bảng tạm thời, nhưng nếu đó là cách duy nhất thực tế để làm điều này, tôi muốn biết thêm về cách sử dụng bảng tạm thời trong thời trang này.

Tôi cũng đã cố gắng thực hiện một số loại() # hàng đáp ứng điều kiện, nhưng tôi cũng không thể biết cách thực hiện điều đó. Nếu có thể, điều đó cũng sẽ hoạt động.

Phụ Lục: Xin lỗi, tôi muốn kết quả của tôi để có các cột cho KS, Tasks, và Late

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

Thêm vào đó, tôi muốn có một người xuất hiện ngay cả khi họ không có nhiệm vụ muộn.

SUM (TRƯỜNG HỢP KHI Tuổi> Palt THEN 1 ELSE 0 END) Late hoạt động tốt, cảm ơn câu trả lời này!

Hai câu lệnh chọn cũng hoạt động, sử dụng LEFT JOIN để tham gia cũng hoạt động và giờ tôi đã hiểu cách tham gia nhiều lựa chọn theo cách này. Cảm ơn!

+0

Bạn chưa đưa ra ví dụ về kết quả mong đợi. Do đó, một số câu trả lời là kết quả ghép nối. Một số người đang tham gia. Bạn muốn cái nào? – Phil

+0

Xin lỗi, tôi muốn kết quả của tôi để có các cột cho KS, Tasks, và Late KS # Nhiệm vụ # Cuối PERSON1 7 1 nhân viên2 3 1 person3 2 0 (hoặc null) Thêm vào đó, tôi muốn có một người để hiển thị ngay cả khi họ không có nhiệm vụ muộn. Hiện tại đạt được điều này bằng cách sử dụng hai phương thức tuyên bố chọn với LEFT JOIN (trái ngược với INNER JOIN được đề xuất, hoạt động nhưng không hiển thị những người không có nhiệm vụ trễ vì chúng không tồn tại trong SELECT thứ hai . điều này với cột trễ là SUM (TRƯỜNG HỢP KHI Tuổi> Palt THÌ 1 ELSE 0 END) Late – sylverfyre

Trả lời

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

Điều này hoạt động tốt, mặc dù tôi đã không xác định rằng tôi muốn một LEFT JOIN để hồ sơ hiển thị ngay cả khi họ có 0 nhiệm vụ muộn – sylverfyre

+0

Chấp nhận câu trả lời này bởi vì nó trả lời câu hỏi tôi đã hỏi, và nó được định dạng là một tham chiếu tuyệt vời về THAM GIA câu lệnh SELECT :) – sylverfyre

41

Hãy thử một cái gì đó như thế này:

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

Tôi không thể nhận được câu trả lời được chấp nhận để làm việc, nhưng điều này làm việc rất tốt cho nhu cầu của tôi. Cảm ơn. – benvenker

27

Sử dụng 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 

Hoặc UNION ALL nếu bạn muốn bản sao:

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

Union hoặc Union All sẽ chỉ có 2 cột. Khi anh ta muốn 3 người trong số họ – SurajS

11

Nếu Tuổi tác và Palt là các cột trong bảng tương tự, bạn có thể đếm (*) tất cả các nhiệm vụ và chỉ tính tổng số tiền trễ như sau:

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

Đây chính xác là điều tôi muốn, nhưng không biết cách tìm kiếm nó. Tôi không nghĩ đến việc sử dụng SUM (CASE) - cảm ơn. – sylverfyre

+0

Bạn được chào đón :-) –

Các vấn đề liên quan