sql-server - SQL Server CROSS JOIN 与 LEFT OUTER JOIN 和 OVER 与 PARTITION 摘要
问题描述
我想使用交叉连接来确保获得会计科目表和会计期间的每个组合的行。下面的查询可以工作,但我需要细化 SUM(amount) 以仅包含相关数据。第一个样本返回一个结果。第二个弹出一个我无法解决的错误
这有效(有点)
SELECT
gl.companyId, gl.profitCenterId, gl.projectId, gl.projectGroupId,
gl.fiscalId, gl.coaId,
SUM(gl.amount) sumAmountForRow
FROM
fiscal
CROSS JOIN
coa, gl
WHERE
gl.coaId >= 40000 AND gl.coaId < 50000 AND gl.fiscalId = 311
GROUP BY
gl.companyId, gl.profitCenterId, gl.projectId, gl.projectGroupId,
gl.fiscalId, gl.coaId
ORDER BY
gl.coaId
这不起作用并引发错误:
SELECT
gl.companyId, gl.profitCenterId, gl.projectId, gl.projectGroupId,
gl.fiscalId, gl.coaId,
SUM(gl.amount) OVER (PARTITION BY gl.companyId, gl.profitCenterId, gl.projectId, gl.projectGroupId, gl.fiscalId, gl.coaId) AS sumAmountForRow
FROM
fiscal
CROSS JOIN
coa, gl
WHERE
gl.coaId >= 40000 AND gl.coaId < 50000 AND gl.fiscalId = 311
GROUP BY
gl.companyId, gl.profitCenterId, gl.projectId,
gl.projectGroupId, gl.fiscalId, gl.coaId
ORDER BY
gl.coaId
错误是:
消息 8120,级别 16,状态 1,第 54
行列“gl.amount”在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。
感谢帮助!
根据请求,表格财政和 coa
CREATE TABLE [dbo].[fiscal]
(
[Id] INT NOT NULL,
[description] NVARCHAR(50) NULL,
[openOrClosed] NVARCHAR(1) NULL,
[dateFrom] DATE NULL,
[dateTo] DATE NULL,
CONSTRAINT [PK_fiscal] PRIMARY KEY CLUSTERED ([Id] ASC)
);
CREATE TABLE [dbo].[coa]
(
[Id] INT NOT NULL,
[description] NVARCHAR(50) NULL,
[accountType] NVARCHAR(1) NULL,
[statementType] INT NULL,
[jobCostCategory] NVARCHAR(1) NULL,
[accountCategory] INT NULL,
CONSTRAINT [PK_coa] PRIMARY KEY CLUSTERED ([Id] ASC)
);
解决方案
您不需要在第二个查询中包含 group by,窗口中的分区完成了分组的工作(在某种意义上)。所以 sum(gl.amount) 实际上并没有与那个“外部”组相关联,这就是你得到错误的原因。您的查询看起来可能会返回您想要的
推荐阅读
- docker - 有没有办法在非根 docker 容器中创建可写卷?
- android - 蓝牙连接安卓
- c - 有人可以解释我的代码做什么/如何修复它(bst 中的搜索节点)吗?
- javascript - 如何将图像发送到jquery中的视图
- linux - 选择值时显示额外列的 Vala 组合框
- c++ - 我还可以添加什么来通过空格或空格正确拆分 C++ 中的字符串?
- excel - 如何自动更改颜色?
- ios - 如何在 iOS 的 Web Audio 实现中平移音频?
- pyspark - pyspark 将列的最大值保存到参数中?
- objective-c - Objective-C:点击 UIDownPicker 并获取 UITextfield 的值