Sql 返回0而不是实际金额的金额之和

Sql 返回0而不是实际金额的金额之和,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有下面的查询,其中sum(Amount)字段返回的是0,而不是实际的sum值 金额字段的数据类型为十进制(15,2) 查询: SELECT Period ,count(DISTINCT Trans_Date) as [Date_count] ,count(*) as Row_No ,sum([Amount]) as [Amount_Value] ,count(*)-count([Amount]) as [Amount_null]

我有下面的查询,其中sum(Amount)字段返回的是0,而不是实际的sum值

金额字段的数据类型为十进制(15,2)

查询:

SELECT Period
        ,count(DISTINCT Trans_Date) as [Date_count]
        ,count(*) as Row_No
        ,sum([Amount]) as [Amount_Value]
        ,count(*)-count([Amount]) as [Amount_null]
        FROM table1 
    GROUP BY Period
    ORDER BY Period
Period  Account Trans_Date  Amount
2014/03 001234  2014-03-01  4517.45
2014/03 001234  2014-03-01  2120.77
2014/03 001234  2014-03-01  3115.69
2014/03 001245  2014-03-01  1803.78
2014/03 001245  2014-03-01  596.33
2014/03 001245  2014-03-01  null
结果:

Period  Date_count  Row_No  Amount_Value    Amount_null

2014/03 31          15486   0.00            0
你能提出任何可能的原因吗?谢谢

表架构:

CREATE TABLE table1(
    [Period] [varchar](7) NOT NULL,
    [Account] [varchar](12) NULL,
    [Trans_Date] [date] NULL,
    [Amount] [decimal](15, 2) NULL
)
样本数据:

SELECT Period
        ,count(DISTINCT Trans_Date) as [Date_count]
        ,count(*) as Row_No
        ,sum([Amount]) as [Amount_Value]
        ,count(*)-count([Amount]) as [Amount_null]
        FROM table1 
    GROUP BY Period
    ORDER BY Period
Period  Account Trans_Date  Amount
2014/03 001234  2014-03-01  4517.45
2014/03 001234  2014-03-01  2120.77
2014/03 001234  2014-03-01  3115.69
2014/03 001245  2014-03-01  1803.78
2014/03 001245  2014-03-01  596.33
2014/03 001245  2014-03-01  null

合乎逻辑的结论是,数据的
金额
之和实际上是0.00

将数据作为示例,返回正确的结果:

PERIOD  DATE_COUNT  ROW_NO  AMOUNT_VALUE  AMOUNT_NULL
2014/03 1           6       12154.02      1
这是一个SQL小提琴

只是为了纠正评论中的一些误解

  • SUM()
    (和
    AVG()
    MIN()
    MAX()
    中忽略空值)
  • count(*)-count([Amount])
    被正确地用于计算
    NULL
    值的数量(尽管我更喜欢更明确的
    sum公式(Amount为NULL,则为1,否则为0结束)

请发布架构和示例数据。此外,当您删除
GROUP BY
语句时,请发布SELECT查询的结果。count(*)-count([Amount])as[Amount\u null]将始终生成0,因为您得到的是相同的计数值。在我看来,Amount之和不等于0:使用
sum(Isnull([Amount],0))
总和(合并([金额],0))