我如何计算多列?

时间:2017-06-22 05:08:00

标签: sql-server-2008

Here is my Table

我想计算参考编号和每个许可证ex。 BP,AP,OP

我的示例查询

SELECT 
C.CompanyName, 
A.ReferenceNumber, 
    Count(CR.BP, 
          CR.AP,  
          CR.SP, 
          CR.FP, 
          CR.EP, 
          CR.ELP, 
          CR.MP, 
          CR.EGPP, 
          CR.OP, 
          CR.EPTO, 
          CR.ELPTO, 
          CR.MPTO, 
          CR.FSIC, 
          CR.AI, 
          CR.EPTO_R, 
          CR.ELPTO_R, 
          CR.MPTO_R, 
          CR.LOA) 
From Companies AS C 
    inner join ApplicationDetails as A on(C.CompanyId = A.CompanyID) 
    inner join CertificateRecords as CR on(A.ReferenceNumber = CR.ReferenceNumber) 
group by A.ReferenceNumber

ERROR是Count函数需要1个参数。

1 个答案:

答案 0 :(得分:0)

Count指的是行,而不是列 因此,在多列上使用它是没有意义的 您可以使用列名,星号或常量(最后2个是等效的) 这些选项的原因是count忽略null值 - 因此您可以通过两种不同的方式使用它。

使用列名时,您将获得该列中的值数(如果您将其与group by一起使用,则为每个组。请注意,此处null不被视为值,因此如果您的列可以为空,那么您将只获得不是null的行数。

使用星号或常量时,count不会忽略null值,即使行中的所有列都包含null - 该行仍会被计算。

以下是我演示的快速演示:

DECLARE @T AS TABLE
(
    col1 int NULL,
    col2 int NULL
)

INSERT INTO @T VALUES
(1,1),
(1,2),
(1,3),
(1, NULL),
(2,1),
(2,2),
(2,3),
(2, NULL),
(NULL, 1),
(NULL, 2),
(NULL, 3),
(NULL, NULL)

使用所有选项计数:

SELECT  col1, 
        COUNT(col2) As ColumnName,
        COUNT(*) Asterisk,
        COUNT(1) Constant
FROM @T
GROUP BY col1

结果:(请注意,列名称的列会忽略null行)

col1    ColumnName  Asterisk    Constant
NULL    3           4           4
1       3           4           4
2       3           4           4

count(*)count(1)进行比较:

SELECT  COUNT(*) Asterisk,
        COUNT(1) Constant
FROM @T

结果:

Asterisk    Constant
12          12