首页 > 解决方案 > 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)
);

标签: sql-server

解决方案


您不需要在第二个查询中包含 group by,窗口中的分区完成了分组的工作(在某种意义上)。所以 sum(gl.amount) 实际上并没有与那个“外部”组相关联,这就是你得到错误的原因。您的查询看起来可能会返回您想要的


推荐阅读