我有表调用TaxMaster
,我需要将行转换为列,所以我在sql server 2008中使用pivot概念。
我需要列名VAT
与TaxId=1
的列百分比和列名VAT
与TaxId=3
的列值明显相加但我收到错误列{{1已为VAT
pvt
我的查询:
TaxId Name Code Percentage
1 VAT VAT 10
2 Exempted EXE 20
3 VAT VAT 5
预期产出:
select Name,VAT,Exempted,VAT
from
(
select distinct Name, Percentage, TaxId, Code
from Masters.TaxMaster
) up
pivot
(
sum(percentage)
for Code in(VAT,Exempted,Zero,NonVAT,VAT)
) as pvt
答案 0 :(得分:2)
由于您想要从Name
创建具有相同名称的创建列,因此可能更容易使用带有CASE表达式而不是PIVOT函数的聚合函数:
select
Name,
Code,
sum(case when name = 'VAT' and TaxId = 1 then Percentage else 0 end) Vat1,
sum(case when name = 'Exempted' then Percentage else 0 end) Exempted,
sum(case when name = 'Zero' then Percentage else 0 end) Zero,
sum(case when name = 'NonVat' then Percentage else 0 end) NonVat,
sum(case when name = 'VAT' and TaxId = 3 then Percentage else 0 end) Vat3
from TaxMaster
group by name, code;
如果你想使用PIVOT函数,那么我会先为每个TaxId
连接Name= 'VAT"
,这样你就有了不同的列名:
select name = nm,
code,
vat1,
exempted,
zero,
nonvat,
vat3
from
(
select nm = name,
name = case
when name = 'VAT' then name+cast(taxid as varchar(10))
else name
end,
code, percentage
from TaxMaster
) d
pivot
(
sum(percentage)
for name in (Vat1, exempted, zero, nonvat, vat3)
) p;
两者都产生以下结果:
| NAME | CODE | VAT1 | EXEMPTED | ZERO | NONVAT | VAT3 |
|----------|------|------|----------|------|--------|------|
| Exempted | EXE | 0 | 20 | 0 | 0 | 0 |
| VAT | VAT | 10 | 0 | 0 | 0 | 5 |
答案 1 :(得分:0)
我得到了这个枢轴概念的解决方案
我的查询:
select Name
,[VAT] as 'VAT'
,[EXE] as 'Exempted'
,[VAT1] as 'VAT1'
from (SELECT distinct name
,percentage
,code
,TaxId
FROM Masters.TaxMaster) x
pivot (sum(percentage) for code in ([EXE],[VAT1],[VAT])) pp