Sql 查询返回列已存在无效错误?

问题描述 投票:0回答:1

我想按日期和付款以及分行名称和代码分组 我不知道为什么这个 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 | 1021 4333 | 5050

2022-04-30 | 1021 | 1021 6392 | 5050

2022-04-29 | 1021 | 1021 3544 | 3544 5050

2022-04-29 | 1021 | 1021 2300 | 2300 5050

这是没有分组依据的查询片段

This is a snip of the query without the group by

sql-server group-by
1个回答
0
投票

您在两个级别上进行聚合:

  1. 每个分支机构和付款的普通聚合
    SUM(SalesTotal)
    ,由
    GROUP BY
    定义。
  2. windowed 聚合
    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(SUM(FactSalesTable.SalesTotal)) OVER(PARTITION BY Branch.BCode) /AVG(SUM(FactSalesTable.SalesTotal)) OVER(PARTITION BY Branch.BCode) > 1 THEN 'Above Avg' 
        when SUM(SUM(FactSalesTable.SalesTotal)) OVER(PARTITION BY Branch.BCode)/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 16223 平均
2022-04-30 57519 1021 总行 12507 16223 低于平均水平

参见这个数据库<>小提琴。 (感谢 Bart McEndree 提供的测试数据设置。)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.