2015-02-26 2 views
0

У меня повернута запрос, который выводит что-то вроде:SQL Карта значений столбцов в другие столбцы

[ID][Value][DateField1][Val1][Val2][Val3] 
1 R2  2014-01-01 0.3 3.2 3.1 
1 R1  2014-01-02 NULL 2.2 0.5 
1 R2  2014-01-02 0.7 NULL NULL 

мне нужно дополнительно изменить его таким образом, что значение столбца превращается в:

[ID][DateField1][Val1][Val2][Val3][Val1R][Val2R][Val3R] 
1 2014-01-01 0.3 3.2 3.1 R2  R2  R2 
1 2014-01-02 0.7 2.2 0.5 R2  R1  R1 

Это не было бы стержнем, но я не совсем уверен, как это сделать. Если кто-то может указать мне в правильном направлении, я бы очень признателен. Благодаря!

+0

Сообщите больше о расчете/преобразовании значения R. Это поиск или расчет? – shawnt00

+0

Значение R - простой просмотр, никаких расчетов не производится. Столбцы Val1, Val2, Val3 являются фактически поворотными значениями, но для того, чтобы отображать эту информацию для пользователя, мне нужна одна строка на DateField. Предполагается, что значения R помогают цветовому кодированию информации для столбцов Val1, Val2, Val3 на странице отображения. – RizJa

+0

По какой-то причине я даже не видел эту вторую колонку. – shawnt00

ответ

1
with D as (
    yourquery 
) 
select 
    ID, DateField1, 
    sum(Val1) as Val1, 
    sum(Val2) as Val2, 
    sum(Val3) as Val3, 
    min(case when Val1 is not null then Value end) as Val1R, 
    min(case when Val2 is not null then Value end) as Val2R, 
    min(case when Val3 is not null then Value end) as Val3R, 
from D 
group by ID, DateField1 
1

может быть, ваш запрос будет слишком сложным, так что я не уверен, что с помощью with, которые вы можете использовать его, но я тестировал ниже запроса и здесь the DEMO дает именно то, что вы хотите:

create table query ([ID] int, 
[Value] varchar(2),[DateField1] date, 
[Val1] decimal(10,2),[Val2] decimal(10,2), 
[Val3] decimal(10,2)) 

insert into query 
values(1,'R2','2014-01-01',0.3,3.2,3.1), 
     (1,'R1','2014-01-02',null,2.2,0.5), 
     (1,'R2','2014-01-02',0.7,null,null) 

with cte 
as 
(
select * from query -- your query 
)  
select distinct q.ID,q.DateField1, 
    isnull(q.val1 ,(select top 1 qq.val1 from cte qq 
         where qq.ID=q.ID and qq.datefield1=q.datefield1 
         and qq.val1 is not null)) val1, 
    isnull(q.val2,(select top 1 qq.val2 from cte qq 
         where qq.ID=q.ID and qq.datefield1=q.datefield1 
         and qq.val2 is not null)) val2, 
    isnull(q.val3,(select top 1 qq.val3 from cte qq 
         where qq.ID=q.ID and qq.datefield1=q.datefield1 
         and qq.val3 is not null))val3, 
    case 
    when q.val1 is null then (select top 1 qq.value from cte qq 
         where qq.ID=q.ID and qq.datefield1=q.datefield1 
         and qq.val1 is not null) 
    else q.value end as val1R, 
    case 
    when q.val2 is null then (select top 1 qq.value from cte qq 
         where qq.ID=q.ID and qq.datefield1=q.datefield1 
         and qq.val2 is not null) 
    else q.value end as val2R, 
    case 
    when q.val3 is null then (select top 1 qq.value from cte qq 
         where qq.ID=q.ID and qq.datefield1=q.datefield1 
         and qq.val3 is not null) 
    else q.value end as val3R 

from cte q 
+0

Определенно работает +1, спасибо! Но решение @ shawnt00 более красноречиво. – RizJa

+0

добро пожаловать, правильно, есть несколько путей для этого, в начале я пытался использовать такой способ, но я сказал, что у вас может быть несколько строк, а также, возможно, тип значений - varchar и т. Д., В любом случае , удачи. – jfun