现在我在我的sql查询中使用临时表,但我想使用Partition By函数。
我的临时表查询如下:
drop table #Temp;
create table #Temp
(
NAME varchar(50),
EMPID varchar(50),
SS MONEY,
PP MONEY
);
insert into #Temp
select * From
(
select
p1.NAME,
p1.EMPID,
case when p1.AmtPayer = 'SELF' then sum(p1.Salary) else 0 end as S,
case when p1.AmtPayer = 'MANAGER' then sum(p1.Salary) else 0 end as P
from Candidate p1
group by p1.Name, p1.EMPID, p1.AmtPayer
) as P;
select
t.NAME,
t.EMPID,
sum(t.SS) as 'SELF PAID',
sum(t.PP) as 'PARTY PAID'
from #Temp t
group by t.NAME, t.EMPID;
我也得到了预期的结果,但我想使用分区功能执行此操作,我尝试了但结果不准确 -
select
NAME,
EMPID,
sum(Salary) over (partition by AmtPayer) as Total
from dbo.Candidate
输出是:
Vivek 0001 300.00 Vivek 0001 300.00 Vivek 0001 6200.00 Vivek 0001 6200.00 Vivek 0001 6200.00
但我需要:
Vivek 0001 6200.00 300.00
答案 0 :(得分:8)
要做到你想要的,试试这个:
select
Name, EmpId,
sum(case when AmtPayer = 'SELF' then Salary else 0 end) as [Self],
sum(case when AmtPayer = 'MANAGER' then Salary else 0 end) as [Manager]
from dbo.Candidate
group by Name, EmpId;
你可以在聚合函数中使用case语句,这可以让你做很多疯狂的事情:)
但是,正如我对您的问题的评论中所述,这仅在您预先知道固定数量的AmtPayer变体时才有用。
详细说明:partition by
明确设计为不以减少结果集。它仍将每行返回一行,并且您无法做任何改变 - 如果您确实想要减少结果集,则使用group by
代替。结合使用聚合函数可以完成的所有复杂内容,这实际上是一个非常强大的工具 - 适用于partition by
和group by
。另请注意,partition by
可能比group by
慢得多。事实上,我发现使用partition by获取结果计数(即。count over (partition by NULL)
或类似的东西)比简单地执行两个查询慢得多,一个只是计数,另一个是实际结果。 / p>
不要认为你的方式更好,因为它看起来更聪明 - 总是衡量。分析是你的朋友。像SQL Server这样的系统正在进行大量优化,这些优化会一直尝试为看似愚蠢的查询提供出色的性能:)
答案 1 :(得分:0)
我使用了以下查询:
DROP TABLE #Temp
CREATE TABLE #Temp(
NAME VARCHAR(50),
EMPID VARCHAR(50),
SS MONEY,
PP MONEY
)
INSERT INTO #Temp
Select * From(
SELECT DISTINCT
NAME,EMPID,
SUM(CASE WHEN AmtPayer='SELF' then Salary ELSE 0 end) OVER (PARTITION BY AmtPayer) AS SS ,
SUM(CASE WHEN AmtPayer='MANAGER' THEN Salary ELSE 0 end) OVER (PARTITION BY AmtPayer) AS PP
FROM dbo.Candidate
)AS P
SELECT DISTINCT t.NAME ,t.EMPID ,SUM(t.SS) OVER(PARTITION BY t.NAME,t.EMPID) AS 'SELF PAID',
SUM(t.PP) OVER(PARTITION BY t.NAME,t.EMPID) AS 'PARTY PAID' FROM #Temp t
--GROUP BY t.NAME ,t.EMPID