2017-08-01 38 views
8

我目前使用它来统计表中的所有数字或行,并且它适用于我所需要的。SQL COUNT行导致在单独的列

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

我唯一的问题是我必须重复这个声明很多,而只是每次改变一些东西。我想联合这些选择,但结果显示在一个单独的列中,下面的示例将获得结果,但将它们全部放在同一列中。任何想法如何让他们在自己的专栏显示一个STCount和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 

结果将是,

STCount NCCount 
    100  202 
+0

请你给当前的结果和预期的结果以表格的形式,使我们可以了解问题 – Ashu

回答

12

您可以在select从句中做选择,不需要一个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

理查德更加清晰,有没有一种方法来设置使用这种方法的列名? – Ryan

+0

@Ryan是的,用你需要的名字替换'rows1'和'rows2'。 – Richard

+0

@理查德我做了这个,但它出现(无列名).... – 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,我试过但我仍然得到(没有列名) – Ryan

+0

我改了括号,也许再试一次。我无法测试它,所以对不起,如果这不起作用 – RealCheeseLord

+0

啊,忘了它。它现在与richards一样... – RealCheeseLord

2

基本上,你只需要提供每个列的占位符在你的工会声明:

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 

以上不符合这是后提供所需的输出我添加了我的答案。所以,我建议你带着其他答案之一(例如Richard的答案)。

2

我想你差点就使用UNION ALL而不是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 

更多关于工会UNION ALL VS. UNION

+0

Tukan,我努力让这个工作? – Ryan

+0

什么样的挣扎?你是否有一些错误信息,或者你得到了不同的结果吗?需要更多信息来帮助你。 – 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

你可以使用一个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

,你可以在这个月的条件如果你有不同的月份这样:当DType ='STR'和Month(EDate)='07'并且添加EDATE在FROM(选择不同的EDate,DType, RNum .... –

0

更实际的方法可能是选择每种类型的计数作为单独的记录并使用分组:

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

这将很好,但我需要DPoint,RNum的不同选择以获得正确的计数。 – Ryan