2014-02-26 20 views
0

我有表名爲TaxMaster,我需要的行轉換成列,所以我使用SQL Server樞紐的概念2008年透視表在SQL Server上相同的列名

我需要列百分比的總和列名VATTaxId=1和列名VATTaxId=3清楚,但我得到的錯誤作爲列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 

預期輸出:

Name  Code  VAT  Exempted  VAT1 
VAT  VAT  10   0    0 
Exempted EXE  0   20    0 
VAT  VAT  0   0    5 

回答

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 
2

由於要轉動從Name具有相同的名稱可能是更容易使用聚合函數CASE表達式,而不是旋轉功能創建列:

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

如果你想使用的旋轉功能,那麼我會串連的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 |