我想按日期和付款以及分行名称和代码分组 我不知道为什么这个 SQL 查询返回这个错误:
列“FactSalesTable.SalesTotal”在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。
SELECT
FactSalesTable.Date,
FactSalesTable.PaymentID,
Branch.* ,
SUM(FactSalesTable.SalesTotal) AS TotalSales,
AVG (FactSalesTable.SalesTotal) OVER(PARTITION BY Branch.BCode) as AvgSales ,
case
when SUM(FactSalesTable.SalesTotal) OVER(PARTITION BY Branch.BCode) /AVG(FactSalesTable.SalesTotal) OVER(PARTITION BY Branch.BCode) > 1 THEN 'Above Avg'
when SUM(FactSalesTable.SalesTotal) OVER(PARTITION BY Branch.BCode)/AVG(FactSalesTable.SalesTotal) OVER(PARTITION BY Branch.BCode) = 1 THEN 'Avg'
else 'Below Avg'
end as SalesResult
FROM Branch
LEFT JOIN FactSalesTable ON Branch.BCode = FactSalesTable.BCode
WHERE FactSalesTable.SalesTotal > 0 and Branch.BCode = 1021
Group BY FactSalesTable.Date,Branch.BranchName ,Branch.BCode,FactSalesTable.PaymentID
ORDER BY FactSalesTable.Date DESC
我想按日期显示总销售额,例如
日期 | B代码 | 总销售额 | 平均 |
---|---|---|---|
2023-04-30 | 1021 | 4333 | 5050 |
2022-04-30 | 1021 | 6392 | 5050 |
2022-04-29 | 1021 | 3544 | 5050 |
2022-04-29 | 1021 | 2300 | 5050 |
这是没有分组依据的查询片段
您在两个级别上进行聚合:
SUM(SalesTotal)
,由 GROUP BY
定义。SUM(...) OVER(...)
和 AVG(...) OVER(...)
涵盖由 OVER(,,,)
窗口说明符定义的每个分支的所有付款。您的问题是,当我相信您打算对分组值进行求和和平均时,您的窗口聚合函数正在尝试访问原始数据。我相信您需要的是
AVG(SalesTotal) OVER(...)
,而不是 AVG(SUM(SalesTotal)) OVER(...)
。 但是,对于 SUM()
计算中的 SalesResult
情况,我相信您只需要普通(非窗口)分支和付款金额 SUM(SalesTotal)
,而不是分支级别的总和。
此外,由于您已约束
FactSalesTable.SalesTotal > 0
,因此 FactSalesTable
行必须存在,并且您的 LEFT JOIN
实际上是 INNER JOIN
。
以下内容应该更接近您想要实现的目标。
SELECT
FactSalesTable.Date,
FactSalesTable.PaymentID,
Branch.* ,
SUM(FactSalesTable.SalesTotal) AS TotalSales,
AVG (SUM(FactSalesTable.SalesTotal)) OVER(PARTITION BY Branch.BCode) as AvgSales ,
case
when SUM(FactSalesTable.SalesTotal)
/ AVG(SUM(FactSalesTable.SalesTotal)) OVER(PARTITION BY Branch.BCode) > 1
THEN 'Above Avg'
when SUM(FactSalesTable.SalesTotal)
/ AVG(SUM(FactSalesTable.SalesTotal)) OVER(PARTITION BY Branch.BCode) = 1
THEN 'Avg'
else 'Below Avg'
end as SalesResult
FROM Branch
LEFT JOIN FactSalesTable ON Branch.BCode = FactSalesTable.BCode
WHERE FactSalesTable.SalesTotal > 0 and Branch.BCode = 1021
Group BY FactSalesTable.Date,Branch.BranchName ,Branch.BCode,FactSalesTable.PaymentID
ORDER BY FactSalesTable.Date DESC
结果:
日期 | 付款ID | B代码 | 分行名称 | 总销售额 | 平均销售额 | 销售业绩 |
---|---|---|---|---|---|---|
2022-04-30 | 57517 | 1021 | 总行 | 19939.00 | 16223.000000 | 高于平均水平 |
2022-04-30 | 57519 | 1021 | 总行 | 12507.00 | 16223.000000 | 低于平均水平 |
参见这个数据库<>小提琴。 (感谢 Bart McEndree 提供的测试数据设置。)
有可能进一步重构查询以限制冗余表达式并提高可读性的方法,例如将初始分组逻辑移至子查询或 CTE,并在最终/外部查询中执行窗口操作。另一种可能是将所有支付逻辑包装在
CROSS APPLY
中。