2017-12-28 1 views
1

SQL 쿼리가 있으며 PIVOT 테이블이 생성됩니다.날짜가있는 동적 SQL 쿼리

여기 있습니다.

SELECT * 
FROM (
    SELECT 
    Name 
    ,Year 
    ,sum(Payment) as TotalPayment 
    FROM Orders 
    group by Name,Date 
) as Tablo 
PIVOT 
(
    SUM(TotalPayment) 
    FOR Date IN ([2009-11],[2009-12],[2010-01]) 
) 
AS p 

이 쿼리를 매월 수동으로 매월 추가하는이 쿼리를 작성한 사람과 월간 총 지불액을 받고 있습니다. 나는 그것을 동적으로 할 필요가있다.

루프와 같은 SQL 쿼리를 사용하여 테이블에서 동적으로 월 단위를 얻을 수 있습니까?

도움 주셔서 감사합니다.

+0

사용'동적 SQL' – Squirrel

+0

사용 일 (월, -2, GETDATE는())' – waka

+0

@Squirrel 어떻게 : 생각 : –

답변

2

나는 relative 시간이 아닌 absolute을 사용하려고합니다. 이렇게하면 쿼리가 항상 최신 상태가됩니다. 내가 CTE를 사용하여 단계별로 질의 단계 쓰기

create table t (d date, i int); 
insert into t values 
('2016-01-01', 100), 
-- ... some other data 
('2017-12-13', 100); 

: : 여기 SQL Fiddle

MS SQL 서버 2014 스키마 설정에 샘플을 게시 여기

with 
cooked as   --change to relative months (from today) 
(select datediff(MONTH,getdate(), d) as dif, i 
    from t 
), 
filtered as  --just take the last 12 months 
(select dif as Date, i as TotalPayment 
    from cooked 
    where dif > -12 
) 
select *   --pivoting 
from filtered 
PIVOT 
(
    SUM(TotalPayment) 
    FOR Date IN ([-11],[-10],[-9],[-8], 
       [-7],[-6],[-5],[-4], 
       [-3],[-2],[-1],[0]) 
) 
AS p 

Results을, 여기서 [0]은 나방을 의미하며 [-11]은 12 개월 전을 의미합니다 :

`DATEADD의 라인을 따라
| -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 
|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----| 
| 500 | 500 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |