2016-07-06 54 views
2

我有以下查询:在SQL Server中添加列支点查询

select 
    msisdn, value, date 
from 
    tang 
where 
    date > dateadd(mm, -6, getdate()) 
    and value > 0 

有了这样一些数据:

msisdn  value date 
772102730 1.0000 2016-01-07 08:48:30.540 
772125566 2.0000 2016-01-07 10:01:50.753 
772108924 1.0000 2016-01-07 10:04:27.940 
772136349 5.0000 2016-01-07 10:08:07.183 
772127823 1.0000 2016-01-07 10:08:19.773 
774521923 1.0000 2016-01-07 10:10:13.927 

和下面转动查询:

select msisdn,r1,r2,r3 
from 
(
    select * 
    from 
    (
     select msisdn, value, 'r'+convert(varchar(4),rank() over (partition by msisdn order by date asc)) as r 
     from tang 
     where date > dateadd(mm,-6,getdate()) 
     and value > 0 
    ) a 
    where r < 'r4' 
) a 
pivot 
(
     min(value) 
     for r in (r1,r2,r3) 
) p 

与以下数据:

msisdn  r1  r2  r3 
701048594 1.0000 2.0000 2.0000 
720000810 2.0000 NULL NULL 
720030474 2.0000 2.0000 NULL 
720049121 4.5000 2.0000 3.0000 
720187431 2.0000 2.0000 2.0000 
720189845 3.0000 NULL NULL 
720201300 5.0000 NULL NULL 
720229335 2.0000 NULL NULL 
720458626 2.0000 2.0000 2.0000 
720512511 2.0000 5.0000 2.5000 

,我想数据的列添加如下:

msisdn r1 r2 r3 d1 d2 d3 

其中d1为R1的数据,D2是R2和D3的数据是R3

的数据如何做到这一点?

+0

你是什么意思'd1是r1'等的数据?你的意思是日期栏中的值吗? – Taryn

+0

pivot数据库的mssql实现非常有限。我建议你回到使用基于rank和group by子句的派生表和case表达式。 '最大(当r = 1,然后列结束时)' –

+0

对于混淆感到抱歉,数据意味着r1的日期等,请参阅第一个表格。 – sorineatza

回答

0

我已经解决了这个问题,下面的查询:
select a.msisdn, r1, r2, r3, r1_date, r2_date, r3_date from ( select msisdn,r1,r2,r3 from ( select * from ( select msisdn, value, ''r''+convert(varchar(4),rank() over (partition by msisdn order by date asc)) as r from tang where date > dateadd(mm,-6,getdate()) and value > 0) a where r < ''r4'') a pivot ( min(value) for r in (r1,r2,r3) ) p) a join ( select msisdn,r1_date,r2_date,r3_date from ( select * from ( select msisdn, date, ''r''+convert(varchar(4),rank() over (partition by msisdn order by date asc))+''_date'' as r from tang where date > dateadd(mm,-6,getdate()) and value > 0) a where r < ''r4_date'') a pivot ( min(date) for r in (r1_date,r2_date,r3_date) ) p) b on a.msisdn = b.msisdn

0

您可以使用此查询,而不是合并2个枢查询获得更好的性能。

SELECT msisdn, 
     MIN(CASE WHEN r = 1 THEN value END) AS r1, 
     MIN(CASE WHEN r = 2 THEN value END) AS r2, 
     MIN(CASE WHEN r = 3 THEN value END) AS r3, 
     MIN(CASE WHEN r = 4 THEN value END) AS r4, 
     MIN(CASE WHEN r = 1 THEN date END) AS d1, 
     MIN(CASE WHEN r = 2 THEN date END) AS d2, 
     MIN(CASE WHEN r = 3 THEN date END) AS d3, 
     MIN(CASE WHEN r = 4 THEN date END) AS d4 
FROM (SELECT msisdn, 
       value, 
       RANK() OVER (PARTITION BY msisdn ORDER BY date ASC) AS r 
     FROM tang 
     WHERE date > DATEADD(mm,-6,GETDATE()) 
       AND value > 0 
     ) a 
WHERE r < 4 
GROUP BY msisdn