Sql 总销售额:向客户显示过去的销售额,但不显示当前的销售额

Sql 总销售额:向客户显示过去的销售额,但不显示当前的销售额,sql,sql-server,aggregate-functions,Sql,Sql Server,Aggregate Functions,复习一些sql。。。我正在尝试创建一个2005-2008年度合计销售额的客户列表,但只显示2005-2007年度的销售额,而2008年没有销售额 我构建了两个查询。。。不确定哪一个更有效,但无论哪种方式,我似乎都不知道如何正确地实现where子句 任何帮助都将不胜感激 问题1: select r.ResellerName, (select sum(rs.SalesAmount) from FactResellerSales rs where rs.ResellerKey = r.Reseller

复习一些sql。。。我正在尝试创建一个2005-2008年度合计销售额的客户列表,但只显示2005-2007年度的销售额,而2008年没有销售额

我构建了两个查询。。。不确定哪一个更有效,但无论哪种方式,我似乎都不知道如何正确地实现where子句

任何帮助都将不胜感激

问题1:

select r.ResellerName,
(select sum(rs.SalesAmount) from FactResellerSales rs
where rs.ResellerKey = r.ResellerKey
and rs.OrderDateKey >=20050101 and rs.OrderDateKey <20060101) '2005',

(select sum(rs.SalesAmount) from FactResellerSales rs 
where rs.ResellerKey = r.ResellerKey
and rs.OrderDateKey >=20060101 and rs.OrderDateKey <20070101) '2006',

(select sum(rs.SalesAmount) from FactResellerSales rs
where rs.ResellerKey = r.ResellerKey
and rs.OrderDateKey >=20070101 and rs.OrderDateKey <20080101) '2007',

(select sum(rs.SalesAmount) from FactResellerSales rs
where rs.ResellerKey = r.ResellerKey
and rs.OrderDateKey >=20080101 and rs.OrderDateKey <20090101) '2008'

From DimReseller r
order by r.ResellerName ASC
问题2:

Select r.ResellerName,
SUM(case when OrderDateKey>=20050101 and OrderDateKey<20060101 then rs.SalesAmount else 0 end) '2005',
SUM(case when OrderDateKey>=20060101 and OrderDateKey<20070101 then rs.SalesAmount else 0 end) '2006',
SUM(case when OrderDateKey>=20070101 and OrderDateKey<20080101 then rs.SalesAmount else 0 end) '2007',
SUM(case when OrderDateKey>=20080101 and OrderDateKey<20090101 then rs.SalesAmount else 0 end) '2008'

from DimReseller r
inner join FactResellerSales rs on rs.ResellerKey = r.ResellerKey
Group by r.ResellerName
Order by ResellerName ASC

应该很容易吗?只需在子选择中选择在2008年没有销售的经销商密钥,并将其加入FactResellerSales

SELECT rs.* 
 FROM FactResellerSales rs
 JOIN (SELECT DISTINCT r.ResellerKey
         FROM FactResellerSales
         WHERE OrderDateKey < 20080101) r on rs.ResellerKey = r.ResellerKey
更新

SELECT r.ResellerName,
       sum(rs.SalesAmount) AS SalesAmount
       YEAR(convert(date,CONVERT(varchar(10),rs.OrderDateKey,101))) AS SALES_YEAR
FROM DimReseller r
INNER JOIN (SELECT rs.SalesAmount,
                   rs.Resellerkey,
                   rs.OrderDateKey
              FROM FactResellerSales rs
              INNER JOIN (SELECT DISTINCT a.ResellerKey
                            FROM FactResellerSales
            WHERE OrderDateKey < 20080101) a on rs.ResellerKey = a.ResellerKey) sub on r.Resellerkey = sub.Resellerkey
GROUP BY r.ResellerName
ORDER BY r.ResellerName ASC

只需使用查询2作为内部查询,并选择其中2008为零:

Select r.ResellerName,
SUM(case when OrderDateKey>=20050101 and OrderDateKey<20060101 then rs.SalesAmount else 0 end) '2005',
SUM(case when OrderDateKey>=20060101 and OrderDateKey<20070101 then rs.SalesAmount else 0 end) '2006',
SUM(case when OrderDateKey>=20070101 and OrderDateKey<20080101 then rs.SalesAmount else 0 end) '2007',
SUM(case when OrderDateKey>=20080101 and OrderDateKey<20090101 then rs.SalesAmount else 0 end) '2008'    
from DimReseller r
inner join FactResellerSales rs on rs.ResellerKey = r.ResellerKey
Group by r.ResellerName) x
Having SUM(case when OrderDateKey>=20080101 and OrderDateKey<20090101 then rs.SalesAmount else 0 end) = 0
Order by ResellerName ASC

如果需要。

在理解如何将该联接集成到查询中时遇到困难,是否需要重建?有没有可能得到帮助插入它;请参阅我的最新答案。不必花时间去测试。让我知道它是否有效再次感谢您的帮助,无论是哪种方式,我通过反向工程您的子查询学到了很多2008'=0将始终为false。此查询不会返回任何记录。您正在检查字符串“2008”是否等于0。如果你想这样做,请删除单引号。杰弗里,谢谢你的帮助,不确定你的查询是否符合我的要求,我正在反向工程它。。。但最终还是想向那些2008年没有销售额,但前几年有销售额的客户展示……这只是在列标题中使用数字的问题吗?无论哪种方式都有效!非常感谢各位@user3221111是-这是关于列的名称以及如何引用名称为number@user3221111我刚刚意识到这可以做得容易得多。。。请参见编辑!
select
...
0 as '2008'
...