2016-10-28 2 views
0

그것은 종류의 힘들을 사용하지 않고 각 그룹의 최소 받기하지만 난 내가 한 다음에 cardNumberTSQL :이 설명하는 내부 쿼리

에 의해
1 
2 

을 그룹을했다

DateTime ID# Type  Cost 
8/1 8pm 1 Activate 2 
8/1 8pm 1 Add   15 
8/1 10am 1 Add   30 
8/1 1pm 1 Use   NULL 
8/5 6pm 1 Use   NULL 
8/5 11pm 1 Add   14 
8/12 9am 1 Use   NULL 
8/15 11am 1 Add   100 
8/15 1130am 1 Add   10 
8/15 5pm 1 Use   NULL 
8/1 8pm 2 Activate 2 
8/1 8pm 2 Add   15 
8/1 10am 2 Add   30 
8/1 1pm 2 Use   NULL 
8/3 6pm 2 Use   NULL 
8/3 12pm 2 Add   14 
8/12 9am 2 Use   NULL 
8/15 11am 2 Add   90 
8/18 5pm 2 Use   NULL 

이 테이블이 있다고 가정 해 :

SELECT CardNumber 
     ,SUM(Case when Type = 'Add' then Cost ELSE 0 END) as totalMoneyAdd 
FROM Table 
Group by CardNumber 

1 169 
2 105 

은 지금은 내부 쿼리 또는 중첩 된 쿼리를 사용하지 않고 다른 열을 추가 할 각 ID 번호는 시간이되도록 매일 각 ID #의 초기 추가 합계 만 사용하는 집계 합계 열을 작성하십시오.

예를 들어 ID # 1은 8/1, 8/5, 8/12 및 8/15에서 활성화됩니다. 8/1에서 자세히 살펴보면 ID # 1의 초기 '추가'는 15 달러, 8/5는 14, 8/12는 0, 8/15는 100입니다. 이니셜을 모두 추가하면 ID # 1은 129 달러. 같은 계산은 2

가 SO 전체 내가 원하는 아이디 #에 적용됩니다 :

1 169 129 
2 115 119 

그리고 나는 단지

SELECT CardNumber 
     ,SUM(Case when Type = 'Add' then Cost ELSE 0 END) as totalMoneyAdd 
     --,Add calculations here to calculate this new column 
FROM Table 
Group by CardNumber 
처럼 열을 추가하여 의미 내부 쿼리 또는 중첩 된 쿼리를 사용하지 않고이를 달성 할

일종의 파티션을 사용하려고 생각하고 있지만 중개 쿼리 나 from 절 내부에서 쿼리를 작성해야합니다. 이것이 가능한지 알고 싶습니다.

+0

내가 공통 테이블 식 또는 두 가지를 사용하십시오. – Malk

+0

CTE를 사용하지 않고 이것이 가능합니까? –

+0

저는 그렇게 생각하지 않습니다. 이것에 창 함수를 추가하려고하면'창 함수를 다른 창 함수 또는 집계의 컨텍스트에서 사용할 수 없습니다. ' – Malk

답변

0

예,이 문제를 해결하려면 파티션 바이를 사용해야합니다. 내부 조인 또는 중첩 된 SQL에 관해서는 이러한 유형의 쿼리에 중첩 된 쿼리를 사용해야합니다. 계산에 오류가 있다고 생각하여 내 anwser가 일치하지 않습니다. 나는 당신을 위해 두 가지 샘플 쿼리를 만들었습니다. 첫 번째는 내부 쿼리이고 두 번째는 내부 쿼리가없는 경우입니다. 나는 실제 테이블이 없으므로 날짜와 시간을 두 개의 열로 나눴습니다. 그것을 위해 필요한 변환을하십시오. 두 번째 쿼리의 경우에는 결과 집합을 제공하지 않지만 필요에 따라 ID를 그룹화하고 다른 열을 합산하여 원하는 결과를 얻으십시오.

쿼리 1 :

select id,sum(cost) totalmoneyadd, sum(totalmoneyinit) totalmoneyinit 
from 
(
    select 
    id 
    ,cost 
    , case when rank() over (partition by id,date order by id,date,time) =1 then cost else null end totalmoneyinit 
    from 
    (
     select '8/1' date,20 time, 1 id,'Activate' type, 2 cost 
     union 
     select '8/1',20, 1,'Add', 15 
     union 
     select '8/1',10, 1,'Add',   30 
     union 
     select '8/1',13, 1,'Use',  NULL 
     union 
     select '8/5',18, 1,'Use',   NULL 
     union 
     select '8/5',23, 1,'Add',   14 
     union 
     select '8/12', 9, 1,'Use',   NULL 
     union 
     select '8/15', 11, 1, 'Add',   100 
     union 
     select '8/15', 11.5, 1,'Add',   10 
     union 
     select '8/15',17, 1 , 'Use', NULL 
     union 
     select '8/1',20, 2,'Activate', 2 
     union 
     select '8/1',20, 2 ,'Add',   15 
     union 
     select '8/1', 10, 2,'Add',   30 
     union 
     select '8/1',13, 2,'Use',   NULL 
     union 
     select '8/3',18, 2,'Use',   NULL 
     union 
     select '8/3', 12, 2 ,'Add',   14 
     union 
     select '8/12', 9, 2 ,'Use',   NULL 
     union 
     select '8/15', 11, 2 ,'Add',   90 
     union 
     select '8/18', 17, 2 ,'Use',   NULL 
    )A 
    where type='Add' 
) B 
group by id 

질의 2 :

select 
case when rank() over (partition by id,date order by id,date,time) =1 then id else null end id 
,case when rank() over (partition by id,date order by id,date,time) =1 then sum(cost) over (partition by id,date order by id,date,time desc) else null end totalmoneyadd 
, case when rank() over (partition by id,date order by id,date,time) =1 then cost else null end totalmoneyinit 
from 
(
    select '8/1' date,20 time, 1 id,'Activate' type, 2 cost 
    union 
    select '8/1',20, 1,'Add', 15 
    union 
    select '8/1',10, 1,'Add',   30 
    union 
    select '8/1',13, 1,'Use',  NULL 
    union 
    select '8/5',18, 1,'Use',   NULL 
    union 
    select '8/5',23, 1,'Add',   14 
    union 
    select '8/12', 9, 1,'Use',   NULL 
    union 
    select '8/15', 11, 1, 'Add',   100 
    union 
    select '8/15', 11.5, 1,'Add',   10 
    union 
    select '8/15',17, 1 , 'Use', NULL 
    union 
    select '8/1',20, 2,'Activate', 2 
    union 
    select '8/1',20, 2 ,'Add',   15 
    union 
    select '8/1', 10, 2,'Add',   30 
    union 
    select '8/1',13, 2,'Use',   NULL 
    union 
    select '8/3',18, 2,'Use',   NULL 
    union 
    select '8/3', 12, 2 ,'Add',   14 
    union 
    select '8/12', 9, 2 ,'Use',   NULL 
    union 
    select '8/15', 11, 2 ,'Add',   90 
    union 
    select '8/18', 17, 2 ,'Use',   NULL 
)A 
where type='Add'