我正在解决基于Adventure Works 2012的任务。
对于每个会计年度(2007年和2008年),请查找第一个日期,即当年累计营业收入达到1000万美元。
输出应包括以下几列:
会计年度(2007或2008)。 达到或超过1000万美元的订单日期。 在达到或超过1000万美元的会计年度内的订单计数(例如,如果在第50个订单上达到了1000万美元的目标,则报告的适当值为50)。 达到1000万美元目标的订单ID。 达到或超过1000万美元的总营业收入。 DROP TABLE #data SELECT YEAR(DATEADD(MONTH, 6, OrderDate)) FiscalYear, CAST(OrderDate AS DATE) OrderDate, SalesOrderID OrderID, COUNT(*) OVER(Partition BY YEAR(DATEADD(MONTH, 6, OrderDate)) ORDER BY SalesOrderID) OrderCount, SUM(SubTotal) OVER(Partition BY YEAR(DATEADD(MONTH, 6, OrderDate)) ORDER BY SalesOrderID) RunTotal INTO #data FROM sales.SalesOrderHeader WHERE YEAR(DATEADD(MONTH, 6, OrderDate)) IN (2007, 2008)
SELECT TOP 1 FiscalYear, OrderDate, OrderCount, OrderID, RunTotal FROM #data WHERE RunTotal>=10000000 AND FiscalYear=2007 UNION SELECT TOP 1 FiscalYear, OrderDate, OrderCount, OrderID, RunTotal FROM #data WHERE RunTotal>=10000000 AND FiscalYear=2008 临时表#data检索由FiscalYear分区并在该分区内按OrderID排序的正确集,以进行3次连续执行,并在以下UNION查询中呈现正确的结果,在 此处输入图像描述
但是随后,在接下来的两次执行中,顺序被打乱了:数千个2008 FiscalYear行推高了记录集,而无视COUNT顺序,并且2008(TOP 1)的结果变得不正确,请 在此处输入图像描述
然后它会恢复正常执行3次,依此类推。每当我擦除
SUM(SubTotal) OVER(Partition BY YEAR(DATEADD(MONTH, 6, OrderDate)) ORDER BY SalesOrderID) RunTotal 从时态表中,顺序工作正常。我对这种奇怪的行为感到困惑。
问题来源于stack overflow
TOP没有则该子句毫无意义ORDER BY。在您的查询中,您说的是“从FiscalYear xxxx和RunTotal> = 10000000的所有结果行中任意选择一行”。这样做的原因是表数据被认为是无序的数据集。没有ORDER BY就没有保证的顺序。
因此:
SELECT * FROM ( SELECT TOP 1 FiscalYear, OrderDate, OrderCount, OrderID, RunTotal FROM #data WHERE RunTotal >= 10000000 AND FiscalYear = 2007 ORDER BY RunTotal ) year2007 UNION ALL SELECT * FROM ( SELECT TOP 1 FiscalYear, OrderDate, OrderCount, OrderID, RunTotal FROM #data WHERE RunTotal >= 10000000 AND FiscalYear = 2008 ORDER BY RunTotal ) year2008; 我已更改UNION为UNION ALL,因为没有要删除的重复项。
查询结果还是一个表。因此,同样的规则适用:如果您想要某些特定的订单,则需要ORDER BY。如果希望2007年在2008年之前,请添加ORDER BY FiscalYear到查询的末尾。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。