Sql 按分组求和不显示零和

Sql 按分组求和不显示零和,sql,sql-server,case,Sql,Sql Server,Case,我试图从一个表中获取数据。我按货币分组。我列出了12个条件。但有些是零 SELECT ISNULL(SUM(AMOUNT), 0) AS TOPL, CURR FROM XXX WHERE DATEPART(year, CONVERT(dateTime, DATE)) = 2018 AND DATEPART(month, CONVERT(dateTime, DATE)) = 1 GROUP BY CURR 这将返回3个值。但我想要12个值,包括零和。我试着用这个箱子,但我做

我试图从一个表中获取数据。我按货币分组。我列出了12个条件。但有些是零

SELECT ISNULL(SUM(AMOUNT), 0) AS TOPL,
    CURR
FROM XXX 
WHERE DATEPART(year, CONVERT(dateTime, DATE)) = 2018 
    AND DATEPART(month, CONVERT(dateTime, DATE)) = 1
GROUP BY CURR
这将返回3个值。但我想要12个值,包括零和。我试着用这个箱子,但我做不到


谢谢…

我可能会得到你想要做的

如果你有12美元,我猜是货币?并希望获得2018年1月按货币分组的交易总额

如果是这种情况,请尝试以下操作:

SELECT ISNULL(SUM(AMOUNT), 0) AS TOPL,
    CURR_TABLE.CURR
FROM CURR_TABLE 
LEFT JOIN XXX ON XXX.CURR = CURR_TABLE.CURR
WHERE DATEPART(year, CONVERT(dateTime, XXX.DATE)) = 2018 
    AND DATEPART(month, CONVERT(dateTime, XXX.DATE)) = 1
GROUP BY CURR_TABLE.CURR
这样,即使当月没有该货币的记录,您也可以列出所有货币

编辑:

我不喜欢那种可以避免的语法,但你可以:

SELECT ISNULL(SUM(AMOUNT), 0) AS TOPL,
    CURR_TABLE.CURR
FROM (SELECT distinct CURR FROM XXX) CURR_TABLE
LEFT JOIN XXX ON XXX.CURR = CURR_TABLE.CURR
WHERE DATEPART(year, CONVERT(dateTime, XXX.DATE)) = 2018 
    AND DATEPART(month, CONVERT(dateTime, XXX.DATE)) = 1
GROUP BY CURR_TABLE.CURR

我可能会明白你想做什么

如果你有12美元,我猜是货币?并希望获得2018年1月按货币分组的交易总额

如果是这种情况,请尝试以下操作:

SELECT ISNULL(SUM(AMOUNT), 0) AS TOPL,
    CURR_TABLE.CURR
FROM CURR_TABLE 
LEFT JOIN XXX ON XXX.CURR = CURR_TABLE.CURR
WHERE DATEPART(year, CONVERT(dateTime, XXX.DATE)) = 2018 
    AND DATEPART(month, CONVERT(dateTime, XXX.DATE)) = 1
GROUP BY CURR_TABLE.CURR
这样,即使当月没有该货币的记录,您也可以列出所有货币

编辑:

我不喜欢那种可以避免的语法,但你可以:

SELECT ISNULL(SUM(AMOUNT), 0) AS TOPL,
    CURR_TABLE.CURR
FROM (SELECT distinct CURR FROM XXX) CURR_TABLE
LEFT JOIN XXX ON XXX.CURR = CURR_TABLE.CURR
WHERE DATEPART(year, CONVERT(dateTime, XXX.DATE)) = 2018 
    AND DATEPART(month, CONVERT(dateTime, XXX.DATE)) = 1
GROUP BY CURR_TABLE.CURR

请执行以下查询,并与您的预期输出进行比较

SELECT CURR, SUM(ISNULL(AMOUNT,0)) AS TOPL,
    CURR
FROM XXX 
WHERE DATEPART(year, CONVERT(dateTime, DATE)) = 2018 
    AND DATEPART(month, CONVERT(dateTime, DATE)) = 1
GROUP BY CURR

请执行以下查询,并与您的预期输出进行比较

SELECT CURR, SUM(ISNULL(AMOUNT,0)) AS TOPL,
    CURR
FROM XXX 
WHERE DATEPART(year, CONVERT(dateTime, DATE)) = 2018 
    AND DATEPART(month, CONVERT(dateTime, DATE)) = 1
GROUP BY CURR

其他人一直想告诉你的是,你需要一个你想在结果中看到的CURR值列表。通常,这些数据来自正确规范化数据库中的另一个表。有吗?似乎不是,但值得一问。一个适当规范化的数据库通常会有一个

那么,如何动态创建此列表?假设您现有的表中至少有一行对应于结果集中所需的每种货币值,即使该行的日期不在您感兴趣的期间内。我们可以使用它来形成这个列表,然后将该列表外部连接到进行求和的现有查询

with curr_list as (select distinct CURR from dbo.XXX)
select curr_list.CURR, 
       sum(isnull(tbl.AMOUNT)) as TOPL 
from curr_list left join dbo.XXX as tbl 
   on curr_list.CURR = tbl.CURR 
   and tbl.[DATE] >= '20180101' 
   and tbl.[DATE] < '20180201'
group by curr_list.CURR
order by curr_list.CURR;
假设我没有打字错误,那应该行得通。名为curr_list的CTE创建您希望在结果集中看到的ID值列表。当您将其加入到事务数据中时,每个CURR值至少会得到一行。然后,对金额求和,将这些行聚合为每种货币值的单行。请注意日期条件的更改。您最初的方法阻止优化器在该列上使用任何有用的索引


如果您现有的表中没有一行包含您想要在结果中显示的每一个CURR值,那么您可以简单地更改cte并硬编码您想要的值

其他人一直想告诉你的是,你需要一个你希望在结果中看到的CURR值列表。通常,这些数据来自正确规范化数据库中的另一个表。有吗?似乎不是,但值得一问。一个适当规范化的数据库通常会有一个

那么,如何动态创建此列表?假设您现有的表中至少有一行对应于结果集中所需的每种货币值,即使该行的日期不在您感兴趣的期间内。我们可以使用它来形成这个列表,然后将该列表外部连接到进行求和的现有查询

with curr_list as (select distinct CURR from dbo.XXX)
select curr_list.CURR, 
       sum(isnull(tbl.AMOUNT)) as TOPL 
from curr_list left join dbo.XXX as tbl 
   on curr_list.CURR = tbl.CURR 
   and tbl.[DATE] >= '20180101' 
   and tbl.[DATE] < '20180201'
group by curr_list.CURR
order by curr_list.CURR;
假设我没有打字错误,那应该行得通。名为curr_list的CTE创建您希望在结果集中看到的ID值列表。当您将其加入到事务数据中时,每个CURR值至少会得到一行。然后,对金额求和,将这些行聚合为每种货币值的单行。请注意日期条件的更改。您最初的方法阻止优化器在该列上使用任何有用的索引


如果您现有的表中没有一行包含您想要在结果中显示的每一个CURR值,那么您可以简单地更改cte并硬编码您想要的值

您的表格中有数据样本吗?我不明白,什么是0,CURR还是AMOUNT?创建一个值为1到12的帮助表。右键连接该表。表中是否有与您编写的where子句匹配的9个条目的数据?因为SUM是在数据被过滤后应用于数据的。因此,结果集中不会出现不存在的条目。不,除9个条目以外的任何数据@jarlh saidDo您的表中有数据样本吗?我不明白,什么是0,CURR还是AMOUNT?创建一个值为1到12的帮助表。右键连接该表。表中是否有与您编写的where子句匹配的9个条目的数据?因为SUM是在数据被过滤后应用于数据的。因此,不存在的条目将不会出现在结果集中。不,任何其他9个条目的数据@jarlh saidLeft join。因此,将仍然列出没有匹配项的CURR_表条目。并将WHERE子句移动到左连接中。否则,记录仍将被过滤
你是对的,我把它搞砸了:我把我的查询倒过来了。有任何CURR表。我只有一张桌子。我必须用SQL描述12个变量。如果没有数据,则显示0。好的,选择“无法获取不在表中或不在表的筛选部分中的值”。所以,你们要么创建一个临时的货币列表,要么选择一个和XXX不同的货币加入。因此,将仍然列出没有匹配项的CURR_表条目。并将WHERE子句移动到左连接中。否则,在连接后应用记录时,记录仍将被过滤掉。你是对的,我完全搞砸了:我颠倒了我的查询。有任何CURR表。我只有一张桌子。我必须用SQL描述12个变量。如果没有数据,则显示0。好的,选择“无法获取不在表中或不在表的筛选部分中的值”。所以,要么创建一个临时货币列表,要么加入一个从XXX中选择的不同货币。结果相同。我必须描述变量。如果不显示,如何显示?相同的结果。我必须描述变量。如果我没有,怎么显示呢?它在@SMor上做了一个小小的修改。我宣布新名单包括1到12个数字。因为今年有一些值是空的,但是也许明年会有。如果你现在没有所有的价值,你仍然应该考虑添加一个新的表。如果您不能在模式中添加新表,它可以是您请求中的临时表。我宣布新名单包括1到12个数字。因为今年有一些值是空的,但是也许明年会有。如果你现在没有所有的价值,你仍然应该考虑添加一个新的表。如果不能在模式中添加新表,则它可以是请求中的临时表。