Самое сложное - получить эту строку
2012-02-26 AMEX 0,00
Если вам это не нужно, остальные ответы имеют то, что вы хотите.
declare @Order table
(
OrderID int,
OrderDate date,
CCType varchar(20),
Processed money
)
insert into @Order values
( 451, '2012-02-27', 'AMEX', 10.56),
( 452, '2012-02-27', 'VISA', 20.00),
( 453, '2012-02-27', 'MASTER CARD', 5.00),
( 454, '2012-02-27', 'OTHER', 16.00),
( 455, '2012-02-27', 'AMEX', 10.00),
( 456, '2012-02-26', 'VISA', 11.00),
( 457, '2012-02-26', 'MASTER CARD', 12.00),
( 457, '2012-02-26', 'OTHER', 5.00)
select D.OrderDate, C.CCType, sum(coalesce(T.Processed, 0)) as Processed
from (values('AMEX'),
('VISA'),
('MASTER CARD'),
('OTHER')) as C(CCType)
cross join (select distinct OrderDate
from @Order) as D(OrderDate)
left outer join @Order as T
on D.OrderDate = T.OrderDate and
C.CCType = T.CCType
group by D.OrderDate, C.CCType
order by D.OrderDate desc, C.CCType
Результат:
OrderDate CCType Processed
---------- ----------- ---------------------
2012-02-27 AMEX 20,56
2012-02-27 MASTER CARD 5,00
2012-02-27 OTHER 16,00
2012-02-27 VISA 20,00
2012-02-26 AMEX 0,00
2012-02-26 MASTER CARD 12,00
2012-02-26 OTHER 5,00
2012-02-26 VISA 11,00