2017-08-01 22 views
8

Tôi hiện đang sử dụng tính năng này để đếm tất cả số hoặc hàng trong một bảng và nó hoạt động tốt cho những gì tôi cần.SQL COUNT hàng Kết quả trong các cột riêng biệt

SELECT COUNT(*) AS STCount 
    FROM (SELECT Distinct DPoint, RNum 
      FROM ECount 
      WHERE DType = 'STR' AND Month(EDate) = '07') AS rows 

Vấn đề duy nhất tôi có là tôi phải lặp lại câu lệnh này rất nhiều trong khi chỉ thay đổi một vài điều mỗi lần. Tôi muốn Liên kết các Lựa chọn này nhưng có kết quả hiển thị trong một cột riêng biệt, ví dụ bên dưới hoạt động nhận được kết quả nhưng đặt tất cả chúng trong cùng một cột. Bất kỳ ý tưởng làm thế nào để có chúng hiển thị trong một cột riêng của họ cho STCount và NCCount?

SELECT COUNT(*) AS STCount 
    FROM (SELECT Distinct DPoint, RNum 
      FROM ECount 
     WHERE DType = 'STR' AND Month(EDate) = '07') AS rows 
UNION 
SELECT COUNT(*) AS NCCount 
    FROM (SELECT Distinct DPoint, RNum 
      FROM ECount 
     WHERE DType = 'NCD' AND Month(EDate) = '07') AS rows 

kết quả sẽ là,

STCount NCCount 
    100  202 
+0

bạn có thể vui lòng cung cấp kết quả hiện tại và kết quả mong đợi trong định dạng bảng để chúng tôi có thể rõ ràng hơn về câu hỏi – Ashu

Trả lời

12

Bạn có thể làm chọn trong mệnh đề select và không cần một from.

select (select count(1) 
     from (select distinct DPoint, RNum 
       from ECount 
       where DType = 'STR' 
       and Month(EDate) = '07') as x 
     ) as rows1, 
     (select count(1) 
     from (select distinct DPoint, RNum 
       from ECount 
       where DType = 'NCD' 
       and Month(EDate) = '07') as x 
    ) as rows2; 
+0

Richard, Có cách nào để đặt tên cột bằng phương pháp này không? – Ryan

+0

@Ryan Có, thay thế 'rows1' và' rows2' bằng tên bạn cần. – Richard

+0

@ Richard tôi đã cố gắng này nhưng nó đi lên như (Không có tên cột) .... – Ryan

4
SELECT (SELECT COUNT(*) AS STCount 
      FROM (SELECT Distinct DPoint, RNum 
        FROM ECount 
       WHERE DType = 'STR' AND Month(EDate) = '07')) AS STCount 
     , (SELECT COUNT(*) AS NCCount 
      FROM (SELECT Distinct DPoint, RNum 
        FROM ECount 
        WHERE DType = 'NCD' AND Month(EDate) = '07')) AS NCCount 
+0

RealCheeseLord, tôi đã thử điều này nhưng tôi vẫn nhận được (Không có Tên cột) – Ryan

+0

Tôi đã thay đổi các dấu ngoặc, có thể thử lại. tôi không thể kiểm tra nó, vì vậy xin lỗi nếu điều này không hoạt động hoặc – RealCheeseLord

+0

ah, Quên nó. bây giờ nó giống như những người giàu ... – RealCheeseLord

2

Về cơ bản, bạn chỉ cần cung cấp một giữ chỗ cho mỗi người trong số các cột trong tuyên bố liên minh của bạn:

SELECT COUNT(*) AS STCount, 0 AS NCCount 
FROM (SELECT DISTINCT DPoint, RNum 
     FROM ECount 
     WHERE DType = 'STR' AND Month(EDate) = '07') AS rows 
UNION SELECT 0, COUNT(*) 
FROM (SELECT DISTINCT DPoint, RNum 
     FROM ECount 
     WHERE DType = 'NCD' AND Month(EDate) = '07') AS rows 

Ở trên không phù hợp với các kết quả mong muốn được cung cấp sau Tôi đã thêm câu trả lời của mình. Vì vậy, tôi khuyên bạn nên đi với một trong những câu trả lời khác (ví dụ, câu trả lời của Richard).

2

Tôi nghĩ rằng bạn gần bị nó sử dụng UNION ALL thay vì UNION:

SELECT DType, COUNT(*) FROM (
    SELECT DType From (Select Distinct DPoint, RNum From 
    ECount Where DType = 'STR' and Month(EDate) = '07') as rows 
    UNION ALL 
    SELECT DType From (Select Distinct DPoint, RNum From 
    ECount Where DType = 'NCD' and Month(EDate) = '07') as rows 
) 
GROUP BY DType 
ORDER BY DType 

để biết thêm về UNION một UNION ALL VS. UNION

+0

Tukan, tôi đang đấu tranh để làm việc này? – Ryan

+0

Loại đấu tranh nào? Bạn có một số thông báo lỗi hoặc bạn nhận được kết quả khác với bạn mong đợi? Cần thêm thông tin để giúp bạn. – tukan

2
select sum(x.[STR]) as STCount, sum(x.[NCD]) as NCCount 
from ECount 
pivot (count(DType) for DTypein ([NCD], [STR])) as x 
6

Bạn có thể sử dụng một CASE:

SELECT 
    COUNT (CASE WHEN DType = 'STR' THEN (1) ELSE NULL END) AS STCount, 
    COUNT (CASE WHEN DType = 'NCD' THEN (1) ELSE NULL END) AS NCCount 
    FROM (Select Distinct DType, DPoint, RNum From ECount WHERE Month(EDate) = '07') as rows 
+0

và bạn có thể đặt điều kiện của tháng trong WHEN nếu bạn có các tháng khác nhau như sau: WHEN DType = 'STR' và Month (EDate) = '07' và thêm EDate vào FROM (Chọn EDate riêng biệt, DType, DPoint, RNum .... –

0

Một cách tiếp cận thực tế hơn có thể là chọn từng loại tính như một bản ghi riêng biệt và sử dụng nhóm:

SELECT 
    COUNT(*) AS TypeCount, 
    Dtype 
FROM ECount 
WHERE Dtype IN ('STR', 'NCD') 
    AND MONTH(Edate) = '07' 
GROUP BY Dtype; 
+0

Điều này sẽ ổn nhưng tôi cần lựa chọn riêng biệt của DPoint, RNum để có được số lượng chính xác. – Ryan

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