У меня есть следующий запрос, который отлично работает.

;with c as
(
    select company, regionId, isnull(profit, 0) profit from MyTable
    where pricedate = '2015-11-30'
)
select * from c as source pivot (max(profit ) for regionId in ([EU], [US], [JP])) as pvt

Однако я хотел бы внести коррективы в запрос.

Если regionId равен US, я бы хотел умножить прибыль на 0,5, когда regionId равен EU, я бы хотел умножить прибыль на 0,4, а когда JP умножит прибыль на 0,1.

Я не уверен, как лучше это сделать? Должен ли я сделать это перед поворотом, используя оператор case, или есть лучший способ сделать это?

0
mHelpMe 5 Янв 2016 в 12:26

2 ответа

Лучший ответ

Попробуйте вот так,

    ;WITH c
     AS (SELECT company,
                regionId,
                Isnull(profit, 0) profit
         FROM   MyTable
         WHERE  pricedate = '2015-11-30')
SELECT c.company,
       c.regionid,
       CASE
         WHEN c.regionid = 'US' THEN c.profit * 0.5
         WHEN c.regionid = 'EU' THEN c.profit * 0.4
         WHEN c.regionid = 'JP' THEN c.profit * 0.1
         ELSE c.profit
       END AS profit
FROM   c
       PIVOT (Max(profit )
             FOR regionId IN ([EU],
                              [US],
                              [JP])) AS pvt 
1
StackUser 5 Янв 2016 в 09:36
create table #mytable (company varchar(20), regionid varchar(10), profit money, pricedate date)

insert into 
#mytable

select 'csc', 'EU', 1000,'2015-11-30'
union
select 'csc', 'US', 2000,'2015-11-30'
union
select 'csc', 'JP', 3000,'2015-11-30'
union
select 'hp', 'EU', 5000,'2015-11-30'
union
select 'hp', 'US', 4000,'2015-11-30'
union
select 'hp', 'JP', 3000,'2015-11-30'
union
select 'csc', 'EU', 1100,'2015-11-30'
union
select 'hp', 'EU', 5600,'2015-11-30'



;with c as
(
    select company, regionId, 
     case WHEN regionid = 'US' THEN  isnull(profit, 0) * 0.5
         WHEN regionid  = 'EU' THEN  isnull(profit, 0) * 0.4
         WHEN regionid = 'JP' THEN    isnull(profit, 0) * 0.1
         ELSE  isnull(profit, 0)
         END
         AS profit 
         from #MyTable
    where pricedate = '2015-11-30'
)
select * from c as source pivot (max(profit ) for regionId in ([EU], [US], [JP])) as pvt
0
bmsqldev 5 Янв 2016 в 09:42