2017-02-03 3 views
0

Я пытаюсь завершить свертывание на MS SQL, чтобы моя колонка «DET» имела полную сумму в последней строке. Столбец «Прибытие» содержит символы, поэтому, если возможно, я просто пытаюсь, чтобы общая строка в этом столбце была NULL. Когда я сделал Group by Date, DET, Arrive with Rollup, он делает промежуточные итоги, суммируя итоговые значения каждой даты (чего я не хочу, если это возможно).Как сделать свертывание в SQL Server?

Select Date = isnull(Date,'Total'), DET, Arrive = isnull(Arrive, 'Total') from 
    (select convert(VARCHAR, EventDate1, 112) as Date, 
    sum(CASE WHEN Depart = 'DET' and (ETStatus = 'F' or ETStatus = 'L' or ETStatus = 'C') THEN 1 ELSE 0 END) as DET, Arrive 
    from TicketCoupons 
    where EventDate1 >= '20160601' and EventDate1 <= '20160709' 
    group by convert(VARCHAR, EventDate1, 112), Arrive 
    )mytable 
    where PIT > '0' 
    group by Rollup(Date), DET, Arrive 
    order by Date 

Кроме того, я новичок в SQL и я знаю, что мой код, скорее всего, неорганизованный, поэтому я заранее извиняюсь. Я ценю помощь!

+0

Вы можете добавить образец данных и ожидаемый результат –

ответ

0

примечание: неясно, где находится PIT, поэтому его нет в ответе ниже.

Вы можете сделать это с grouping sets вместо:

select 
     [Date]= isnull(convert(varchar(8), EventDate1, 112),'Total') 
    , DET = sum(case 
       when Depart = 'DET'and ETStatus in ('F','L','C') 
        then 1 
       else 0 
       end) 
    , Arrive= Arrive 
    from TicketCoupons 
    where EventDate1 >= '20160601' 
    and EventDate1 <= '20160709' 
    group by grouping sets (
     (convert(varchar(8), EventDate1, 112), Arrive) 
    ,() 
) 
    order by [Date] 

Правильный способ обработки null значения в данном случае является использование grouping() возвращение 'Total' вместо null при использовании grouping sets:

select 
     [Date]= case when grouping(convert(varchar(8), EventDate1, 112)) = 0 
        then 'unknown' -- values of null will return as 'unknown' 
       else 'Total' -- total row will return 'Total' as requested 
       end 
    , DET = sum(case 
       when Depart = 'DET'and ETStatus in ('F','L','C') 
        then 1 
       else 0 
       end) 
    , Arrive= case when grouping(Arrive) = 0 
        then 'unknown' -- values of null will return as 'unknown' 
       else null -- total row will return `null` as requested 
       end 
       */ 
    from TicketCoupons 
    where EventDate1 >= '20160601' 
    and EventDate1 <= '20160709' 
    group by grouping sets (
     (convert(varchar(8), EventDate1, 112), Arrive) 
    ,() 
) 
    order by [Date] 

ссылка:

+0

Это было прекрасно! Спасибо, что нашли время, чтобы помочь мне. Ценить это! – Alex

Смежные вопросы