2017-08-01 36 views
8

Obecnie używam tego do zliczania wszystkich liczb lub wierszy w tabeli i działa dobrze na to, czego potrzebuję.SQL COUNT Rows Wynik w oddzielnych kolumnach

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

Jedyny problem, jaki mam, to powtarzanie tego stwierdzenia za każdym razem, gdy zmieniamy tylko kilka rzeczy. Chciałbym ujednolicić te selekcje, ale pokaż wyniki w oddzielnej kolumnie. Poniższy przykład pokazuje wyniki, ale umieszcza je wszystkie w tej samej kolumnie. Wszelkie pomysły, jak je pokazać w swojej kolumnie pierwszej dla STCount i 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 

wynik byłby,

STCount NCCount 
    100  202 
+0

Czy mógłbyś podać obecny wynik i oczekiwany wynik w formacie tabeli, abyśmy mogli być bardziej klarowne na temat pytania – Ashu

Odpowiedz

12

Można zrobić wybiera w klauzuli select i nie potrzebują 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, Czy istnieje sposób na ustawienie nazw kolumn za pomocą tej metody? – Ryan

+0

@Ryan Tak, zamień 'rows1' i' rows2' z nazwami, których potrzebujesz. – Richard

+0

@ Richard próbowałem tego, ale pojawił się jako (bez nazwy kolumny) ... – 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, próbowałem tego, ale nadal otrzymuję (bez nazwy kolumny) – Ryan

+0

Zmieniłem nawiasy, może spróbuję ponownie. Nie mogę tego przetestować, więc przepraszam, jeśli to nie zadziała, – RealCheeseLord

+0

ah, Zapomnij o tym. to jest teraz to samo co richards ... – RealCheeseLord

2

Zasadniczo wystarczy, aby zapewnić zastępczy dla każdej z kolumn w swoim oświadczeniu związków:

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 

Powyższa nie są zgodne z pożądanym wyjściem który został dostarczony po Dodałem moją odpowiedź. Sugerowałbym, abyś podszedł do jednej z innych odpowiedzi (np. Jednej z Richarda).

2

myślę, że mało nie używać UNION ALL zamiast 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 

dłużej o Unii UNION ALL VS. UNION

+0

Tukan, walczę, żeby to zadziałało? – Ryan

+0

Jakiego rodzaju zmagania? Czy masz komunikat o błędzie lub czy otrzymujesz inny rezultat, niż się spodziewałeś? Potrzebujesz więcej informacji, aby Ci pomóc. – 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

Można użyć koperty:

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

i możesz umieścić stan miesiąca w KIEDY, jeśli masz różne miesiące takie jak to: WHEN DType = "STR" i Month (EDate) = '07' i dodaj EDate w FROM (Wybierz Distinct EDate, DType, DPoint, RNum .... –

0

Bardziej praktycznym podejściem może być wybór każdego rodzaju liczenia jako oddzielnego rekordu i użycie grupowania:

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

To byłoby w porządku, ale potrzebuję Wybitnego wyboru DPoint, RNum, aby uzyskać prawidłową liczbę. – Ryan