THAM GIA hai kết quả câu lệnh CHỌN


174

Có thể tham gia kết quả của 2 SELECTcâu lệnh sql trong một câu lệnh không? Tôi có một cơ sở dữ liệu về các nhiệm vụ trong đó mỗi bản ghi là một nhiệm vụ riêng biệt, có thời hạn (và a PALT, chỉ là một INTngày từ khi bắt đầu đến thời hạn. AgeCũng là một INTsố ngày.)

Tôi muốn có một bảng có mỗi người trong bảng, số lượng nhiệm vụ họ có và số lượng LATEnhiệm vụ 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

trả về dữ liệu 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 kết quả của hai selecttuyên bố này (bằng cách KS)

Tôi đang cố gắng tránh sử dụng bảng tạm thời, nhưng nếu đó là cách thực tế duy nhấ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 theo cách này.

Tôi cũng đã thử làm một số loại count()hàng thỏa mãn điều kiện, nhưng tôi cũng không thể tìm ra cách để làm điều đó. Nếu có thể, điều đó cũng sẽ làm việc.

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

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

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

SUM(CASE WHEN Age > 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 a LEFT JOINđể tham gia chúng cũng hoạt động và bây giờ tôi hiểu cách tham gia nhiều selects theo cách này


Bạn đã không đưa ra một ví dụ về kết quả mong đợi. Một số câu trả lời là kết quả nối. Một số đang tham gia. Bạn muốn cái nào
Phil

Xin lỗi, tôi muốn kết quả của mình có các cột cho KS, Nhiệm vụ và cuối KS # Nhiệm vụ # Người muộn1 7 1 người2 3 1 người3 2 0 (hoặc null) Ngoài ra, tôi muốn một người xuất hiện ngay cả khi họ không có nhiệm vụ muộn . Hiện đang đạt được điều này bằng cách sử dụng phương thức hai câu lệnh chọn với LEFT THAM GIA (trái ngược với INNER THAM GIA được đề xuất, hoạt động nhưng không hiển thị những người không có nhiệm vụ muộn vì họ không tồn tại trong CHỌN thứ hai Cũng đạt được điều này khi trễ cột là SUM (CASE KHI Tuổi> Palt THÌ 1 ELSE 0 END) Trễ
sylverfyre

Câu trả lời:


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
Đ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 THAM GIA TRÁI PHIẾU để các hồ sơ hiển thị ngay cả khi chúng có 0 nhiệm vụ muộn.
sylverfyre

Đã chấp nhận câu trả lời này vì nó trả lời câu hỏi tôi hỏi tốt nhất và nó được định dạng là một tài liệu tham khảo tuyệt vời về
THAM GIA

Câu trả lời tuyệt vời, nhưng ai đó có thể nói loại 'giải pháp' này được coi là đắt tiền hay nó chỉ phụ thuộc vào việc bạn đang sử dụng nó để làm gì?
petrosmm

71

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

4
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

Làm việc như người ở. Theo tôi thì đây là câu trả lời được chấp nhận. Cảm ơn.
nocdib

Đã làm cho tôi! Cảm ơn! Tôi cũng đã thử sử dụng nhiều truy vấn (nhiều Joins) và nó cũng rất tuyệt. Nếu ai đó đang tự hỏi, bạn chỉ có thể thêm nhiều THAM GIA sau ví dụ "BẬT" cuối cùng và tiếp tục sử dụng trình tự: BẬT .... X THAM GIA (QUERY N -1) TRÊN Y = ZX THAM GIA (QUERY N) TRÊN Y = Z
Caesarmart

43

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 ALLnếu bạn muốn trùng lặp:

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
Kết quả hoặc Liên minh Tất cả sẽ chỉ có 2 cột trong kết quả. Như anh ấy muốn 3 người trong số họ
SurajS

14

Nếu Age và Palt là các cột trong cùng một Bảng, bạn có thể đếm (*) tất cả các tác vụ và chỉ tính tổng các tác vụ muộn như thế này:

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

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.