2014-01-07 2 views
3

지금은 SQL 쿼리에서 임시 테이블을 사용하고 있지만 대신 파티션 별 함수를 사용하고 싶습니다.그룹 대신 OVER (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; 

나뿐만 아니라 예상 된 결과를 얻고있다하지만 난 그것을 시도, 파티션 기능을 사용하여이 작업을 수행하려는하지만 결과는 정확하지 않습니다 -

 
Vivek 0001 300.00 
Vivek 0001 300.00 
Vivek 0001 6200.00 
Vivek 0001 6200.00 
Vivek 0001 6200.00 

하지만이 필요합니다 :

select 
NAME, 
EMPID, 
sum(Salary) over (partition by AmtPayer) as Total 
from dbo.Candidate 

출력은

 
Vivek 0001 6200.00 300.00 
+0

가 표시되도록 코드를 들여하세요 코드와 포맷으로 어느 정도의 온전함으로 포맷하십시오 ... 이것을 읽는 것은 정말로 어렵습니다. –

+0

결과를 그룹화하려면 group by를 사용해야합니다. 창 함수의 전체 목적은 ** 결과 집합을 "감소시키지"않습니다 **. –

+0

가능한 중복 [하위 쿼리의 여러 결과를 하나의 쉼표로 구분 된 값으로 결합] (http://stackoverflow.com/questions/111341/combine-multiple-results-in-a-subquery-into-a-single- 쉼표로 구분 된 값) –

답변

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; 

당신은 집계 함수의 경우 문을 사용할 수 있습니다 미친 것들 : 그러나

을 많이 할 수있게하는 귀하의 질문에 대한 의견에 언급했듯이, 미리 알고있는 AmtPayer 변종의 수가 고정 된 경우에만 유용합니다.

더 자세히 설명하려면 partition by은 결과 집합을 줄이기 위해 이 아닌으로 명시 적으로 설계되었습니다. 행당 하나의 행을 반환 할 것이므로 변경할 수있는 방법이 없습니다. 결과 집합을 줄이려면 group by을 대신 사용하십시오. 집계 함수로 수행 할 수있는 모든 복잡한 작업과 결합하면 실제로는 매우 강력한 도구입니다.이 작업은 partition bygroup by에 모두 적용됩니다. partition bygroup by보다 훨씬 느릴 수 있습니다. 사실, 결과 개수 (즉, count over (partition by NULL) 또는 유사한 것)를 얻기 위해 파티션을 사용하는 것이 단순히 두 개의 쿼리를 수행하는 것보다 훨씬 느리다는 것을 알게되었습니다. 하나는 카운트 용이고 다른 하나는 실제 결과입니다.

항상 똑똑해 보이기 때문에 자신의 길은 더 낫다고 가정하지 마십시오. 프로파일 링은 친구입니다. SQL 서버와 같은 시스템이 모든 시간을 시도 최적화를 많이하고있는 것은 당신에게 겉으로는 바보 쿼리 :

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