Sql 有没有办法避免列被分组

Sql 有没有办法避免列被分组,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的表中有ID、Perdium和Location等列,所以我想计算给员工的所有Perdium和在纽约的Perdium份额。我所面临的问题是,SQL Server引擎抛出一个错误,说明GROUP BY子句中不存在location列(在我的用例中是需要的)。如果我在GROUP BY子句中包含location,我总是将NYPerdiumShare作为1,这不是我所期望的。有什么解决办法吗 WITH CTE_Employee AS ( SELECT ID,

我的表中有ID、Perdium和Location等列,所以我想计算给员工的所有Perdium和在纽约的Perdium份额。我所面临的问题是,SQL Server引擎抛出一个错误,说明GROUP BY子句中不存在location列(在我的用例中是需要的)。如果我在GROUP BY子句中包含location,我总是将NYPerdiumShare作为1,这不是我所期望的。有什么解决办法吗

WITH CTE_Employee AS
    (
        SELECT  ID,
                SUM(Perdium) AS TotalPerdium,
                CASE WHEN Location='NY' THEN SUM(Perdium) ELSE NULL END AS NYPerdium FROM EmployeePerdium
        GROUP BY ID
    )

SELECT  ID,
        TotalPerdium,
        NYPerdium/TotalPerdium AS NYPerdiumShare 
    FROM CTE_Employee

这里不需要cte。只需使用
sum
窗口函数

SELECT DISTINCT
ID,
SUM(Perdium) OVER() as TotalPerdium
SUM(CASE WHEN Location='NY' THEN 1.0*Perdium ELSE 0 END) OVER(PARTITION BY ID)
/SUM(Perdium) OVER() AS NYPerdium 
FROM EmployeePerdium

通过将查询重写为在聚合函数中隐藏
CASE
,可以消除对
ID
以外的任何内容进行分组的需要:

WITH CTE_Employee AS (
    SELECT
        ID
    ,   SUM(Perdium) AS TotalPerdium
    ,   SUM(CASE WHEN Location='NY' THEN Perdium ELSE 0 END) AS NYPerdium
    FROM EmployeePerdium
    GROUP BY ID
)
SELECT
    ID
,   TotalPerdium
,   NYPerdium/TotalPerdium AS NYPerdiumShare 
FROM CTE_Employee

这里将执行整数除法。@vkp我假设
Perdium
不是整数,因为它通常意味着一笔钱。当然..这是一个有效的假设。还有IBS?我想知道他们给了我什么。