sql - 高级 SQL:日期范围内的销售额总和
问题描述
我正在尝试获取某个日期范围内特定产品的销售额总和。不幸的是,两个日期结果的销售额总和是相同的。右图 2019/01/01 的总销售额为 5000,第二天 2019/01/02 的总销售额为 3000。结果显示这两天的总销售额为 8000。这是错误的。任何专家都可以帮助改进这个查询吗?
Declare @BusinessDate datetime ='2019-01-01'
Declare @end datetime ='2019-01-02'
DECLARE @StoreId int = 100
SELECT [Terminals].[Id] AS [TerminalId],
[Terminals].[StoreId],
[EOD].[Id] AS [EODId],
SUM([Sales].[SalesAmount]) AS [SalesAmount],
[EOD].BusinessDate
FROM [CEPP]..[Stores] WITH (NOLOCK)
INNER JOIN [CEPP]..[Terminals] WITH (NOLOCK)
ON [Stores].[Id] = [Terminals].[StoreId]
AND [Terminals].[MWorkFlowStatusId] = 2
AND ([Terminals].[MStatusId] = 1
OR ([Terminals].[MStatusId] = 0
AND [Terminals].[SuspendedDate] > @BusinessDate ))
LEFT JOIN [EndOfDays] AS [EOD] WITH (NOLOCK)
ON [Terminals].[Id] = [EOD].[TerminalId]
AND [EOD].[BusinessDate] >= @BusinessDate and [EOD].[BusinessDate]<=@end
CROSS APPLY (
SELECT SUM([Products].[Deno]) AS [SalesAmount]
FROM [SalesOrders] AS [SO] WITH (NOLOCK)
INNER JOIN [SalesTransactions] AS [ST] WITH (NOLOCK)
ON [SO].[Id] = [ST].[SalesOrderId]
LEFT JOIN [VoidOrders] AS [VO] WITH (NOLOCK)
INNER JOIN [VoidTransactions] AS [VT] WITH (NOLOCK)
ON [VO].[Id] = [VT].[VoidOrderId]
ON [SO].[DealerId] = [VO].[DealerId]
AND [SO].[StoreId] = [VO].[StoreId]
AND [SO].[TerminalId] = [VO].[TerminalId]
AND [ST].[ProductId] = [VT].[ProductId]
AND [ST].[SerialNo] = [VT].[SerialNo]
AND [ST].[BusinessDate] = [VT].[BusinessDate]
AND [VT].[MVoidTypeId] = 1
INNER JOIN [CEPP].[dbo].[Products] WITH (NOLOCK)
ON [ST].[ProductId] = [Products].[Id]
WHERE [EOD].[Id] IS NOT NULL
AND [VT].[SerialNo] IS NULL
AND [SO].[TerminalId] = [Terminals].[Id]
AND [ST].[BusinessDate] >= @BusinessDate and [ST].[BusinessDate] <= @end
) AS [Sales]
WHERE [Stores].[DealerId] = 1 AND (@StoreId IS NULL OR [Terminals].[StoreId] = @StoreId)
GROUP BY [Terminals].[Id], [Terminals].[StoreId], [EOD].[Id], [Stores].[Code], [Terminals].[Code],[EOD].BusinessDate
ORDER BY ISNULL([EOD].[Id], 0), [Stores].[Code], [Terminals].[Code]
我得到的意外结果是:
TerminalId StoreId EODId SalesAmount BusinessDate
21598 100 5427531 8000.00 2019-01-01 00:00:00.000
21598 100 5427532 8000.00 2019-01-02 00:00:00.000
结果应该是这样的:
TerminalId StoreId EODId SalesAmount BusinessDate
21598 100 5427531 5000.00 2019-01-01 00:00:00.000
21598 100 5427532 3000.00 2019-01-02 00:00:00.000
解决方案
AND [EOD].[BusinessDate] >= @BusinessDate 和 [EOD].[BusinessDate]<=@end
这部分在我看来非常可疑。我认为应该是这样的
[EOD].[BusinessDate] = [Sales].[Date]
如果这不能解决您的问题,请向我们提供用于创建表和测试数据的脚本。这样就更容易调查查询。
推荐阅读
- r - R 等效于 SAS put 语句
- python - VisualCode - 浮点对象不可迭代
- java - 为什么要在 Docker 中运行 JVM 进程
- amazon-web-services - 如何关系化包含数组的 JSON
- javascript - 根据文本选择选择选项
- jquery - jquery插件的优化
- jquery - 如何使用 jquery 在同一行显示来自 json_encode 数组的两个值?
- go - golang RFC3339Nano 时间戳可以可靠地转换为 Unix 时间戳吗?
- c - 如何读取输入文件并将整数存储到C中的数组中
- ruby-on-rails - 如何在测试之前停止 Rspec 删除测试数据库