我有一个“月度状态”数据库视图,我需要根据该视图生成报告。视图中的数据如下所示:
Category | Revenue | Yearh | Month Bikes 10 000 2008 1 Bikes 12 000 2008 2 Bikes 12 000 2008 3 Bikes 15 000 2008 1 Bikes 11 000 2007 2 Bikes 11 500 2007 3 Bikes 15 400 2007 4
...等等
该视图具有产品类别,收入,一年零一个月。我想创建一个比较2007年和2008年的报告,在没有销售的月份中显示0。因此,报告应如下所示:
Category | Month | Rev. This Year | Rev. Last Year Bikes 1 10 000 0 Bikes 2 12 000 11 000 Bikes 3 12 000 11 500 Bikes 4 0 15 400
要注意的关键是,第1个月在2008年仅有销售,因此2007年为0。此外,第4个月在2008年没有销售,因此,第0个月在2007年有销售并且仍然显示。
此外,该报告实际上是针对财务年度的-因此,如果2007年或2008年的第5个月没有销售,那么我希望两列都为0。
我得到的查询看起来像这样:
SELECT SP1.Program, SP1.Year, SP1.Month, SP1.TotalRevenue, IsNull(SP2.TotalRevenue, 0) AS LastYearTotalRevenue
FROM PVMonthlyStatusReport AS SP1 LEFT OUTER JOIN PVMonthlyStatusReport AS SP2 ON SP1.Program = SP2.Program AND SP2.Year = SP1.Year - 1 AND SP1.Month = SP2.Month WHERE SP1.Program = 'Bikes' AND SP1.Category = @Category AND (SP1.Year >= @FinancialYear AND SP1.Year <= @FinancialYear + 1) AND ((SP1.Year = @FinancialYear AND SP1.Month > 6) OR (SP1.Year = @FinancialYear + 1 AND SP1.Month <= 6))
ORDER BY SP1.Year, SP1.Month 此查询的问题在于,由于我们在2008年没有任何销售,但实际上在2007年有销售,因此它不会返回上述示例数据中的第四行。
这可能是一个常见的查询/问题,但是经过很长时间的前端开发后,我的SQL还是很生锈。任何帮助是极大的赞赏!
哦,顺便说一句,我正在使用SQL 2005进行此查询,因此,如果有任何有用的新功能可能会让我知道。
问题来源于stack overflow
关于降价-是的,令人沮丧。编辑器确实预览了我的HTML表格,但发布后消失了-因此必须从帖子中删除所有HTML格式...
@kcrumley我认为我们已经得出类似的结论。这个查询很容易变得丑陋。在阅读您的答案之前,我实际上使用类似(但又不同的方法)解决了这一问题。我有权在报表数据库上创建存储过程和函数。我创建了一个表值函数,该函数接受一个产品类别和一个财务年度作为参数。基于此,该函数将填充一个包含12行的表。如果有任何可用的销售,将用视图中的数据填充行,否则,行将具有0值。
然后,我将函数返回的两个表连接在一起。由于我知道所有表都有十二个粗纱,因此分配起来比较容易,我可以加入“产品类别和月份”:
SELECT SP1.Program, SP1.Year, SP1.Month, SP1.TotalRevenue AS ThisYearRevenue, SP2.TotalRevenue AS LastYearRevenue FROM GetFinancialYear(@Category, 'First Look', 2008) AS SP1 RIGHT JOIN GetFinancialYear(@Category, 'First Look', 2007) AS SP2 ON SP1.Program = SP2.Program AND SP1.Month = SP2.Month 我认为您的方法可能更简洁一些,因为GetFinancialYear函数非常混乱!但是至少它能起作用-这让我暂时感到高兴;)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。