在Sql Server中具有相同列名称的数据透视表

时间:2014-02-26 07:58:10

标签: sql-server pivot

我有表调用TaxMaster,我需要将行转换为列,所以我在sql server 2008中使用pivot概念。

我需要列名VATTaxId=1的列百分比和列名VATTaxId=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 

2 个答案:

答案 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;

SQL Fiddle with Demo

如果你想使用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;

请参阅SQL Fiddle with Demo

两者都产生以下结果:

|     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