2014-02-18 32 views
0

我有以下查詢:逆透視從現有的查詢

select'Amount' as Amount, 
('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover], 
('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover], 
('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover], 
123 as [Credit Note Value] 


from tblreservation R 
left join tblreservation rc on R.ReservationsID = rc.reservationsid and rc.Completed = 1 
left join tblreservation rin on R.reservationsid = rin.reservationsid and rin.InProgress = 1 
left join tblreservation run on Run.ReservationsID = r.ReservationsID and run.completed = 0 and run.inprogress = 0 

這將返回像這樣的數據:

CompletedTurnover  In progress Turnover  Unallocated Turnover  Credit Note Value  
1202039920    23998858945    9384585845     123 

這是符合市場預期。然而,我需要下面的輸出,我正在使用樞軸掙扎一下。

Completed Turnover 1202039920    
    In Progress Turnover 23998858945    
    Unallocated Turnover 9384585845     
    Credit Note Value  123 

任何幫助將不勝感激。

回答

1

您可以使用一個工會得到的結果,你需要:

select 'Completed turnover' Description, 
     ( '£'+ CAST(SUM(rc.[Fee Charge] + 
        rc.[Fee Charge VAT] + 
        rc.ExtraCharges+ 
        rc.ExtraChargesVAT+ 
        rc.OtherCharges+ 
        rc.OtherChargesVAT+ 
        rc.WaitingCharge+ 
        rc.[WaitingCharge VAT] 
        )AS nvarchar(50))) value 
from .... 

union all 

select 'In Progress turnover', ..... 
from .... 

union all 

select 'Unallocated Turnover', ..... 
from .... 

你可能想看看使用連同CTE

+0

乾杯伊恩,似乎是一個更好的方式去了解它。我可以接受。 –

0

試試這個,,,,,

select'Amount' as Amount 
union all 
select 
('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover] 
from tblreservation rc where Completed=1 
union all 

select 
('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover] 
from tblreservation rin where InProgress=1 
union all 
select 
('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover] 
from tblreservation run where InProgress=0 and Completed=0 
union all 
select 123 as [Credit Note Value] 
4

將列轉換爲行的過程實際上稱爲UNPIVOT。你可以用幾種不同的方法來做到這一點。

UNPIVOT:功能:

;with cte as 
(
    select'Amount' as Amount, 
    ('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover], 
    ('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover], 
    ('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover], 
    123 as [Credit Note Value] 
    from tblreservation R 
    left join tblreservation rc 
    on R.ReservationsID = rc.reservationsid 
    and rc.Completed = 1 
    left join tblreservation rin 
    on R.reservationsid = rin.reservationsid 
    and rin.InProgress = 1 
    left join tblreservation run 
    on Run.ReservationsID = r.ReservationsID 
    and run.completed = 0 
    and run.inprogress = 0 
) 
select col, value 
from cte 
unpivot 
(
    value 
    for col in (CompletedTurnover, [In Progress Turnover], 
       [Unallocated Turnover], [Credit Note Value]) 
) u; 

CROSS APPLY與價值觀:

;with cte as 
(
    select'Amount' as Amount, 
    ('£'+ CAST(SUM(rc.[Fee Charge] +rc.[Fee Charge VAT] +rc.ExtraCharges+rc.ExtraChargesVAT+rc.OtherCharges+rc.OtherChargesVAT+rc.WaitingCharge+rc.[WaitingCharge VAT])AS nvarchar(50))) AS [CompletedTurnover], 
    ('£'+ CAST(SUM(rin.[Fee Charge] +rin.[Fee Charge VAT] +rin.ExtraCharges+rin.ExtraChargesVAT+rin.OtherCharges+rin.OtherChargesVAT+rin.WaitingCharge+rin.[WaitingCharge VAT])AS nvarchar(50))) AS [In Progress Turnover], 
    ('£'+ CAST(SUM(run.[Fee Charge] +run.[Fee Charge VAT] +run.ExtraCharges+rc.ExtraChargesVAT+run.OtherCharges+run.OtherChargesVAT+run.WaitingCharge+run.[WaitingCharge VAT])AS nvarchar(50))) AS [Unallocated Turnover], 
    123 as [Credit Note Value] 
    from tblreservation R 
    left join tblreservation rc 
    on R.ReservationsID = rc.reservationsid 
    and rc.Completed = 1 
    left join tblreservation rin 
    on R.reservationsid = rin.reservationsid 
    and rin.InProgress = 1 
    left join tblreservation run 
    on Run.ReservationsID = r.ReservationsID 
    and run.completed = 0 
    and run.inprogress = 0 
) 
select col, value 
from cte 
cross apply 
(
    values 
    ('CompletedTurnover', CompletedTurnover), 
    ('In Progress Turnover', [In Progress Turnover]), 
    ('Unallocated Turnover', [Unallocated Turnover]), 
    ('Credit Note Value', [Credit Note Value]) 
) c (col, value) 
0

你可能不需要加入,因爲總結果來自同一個表。你也可以使用條件聚集

SELECT 
    SUM(CASE WHEN Completed = 1 THEN 
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT + 
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT] 
    END) AS [Completed Turnover], 
    SUM(CASE WHEN InProgress = 1 THEN 
    ... 
    END) AS [In-progress Turnover], 
    SUM(CASE WHEN Completed = 0 AND InProgress = 0 THEN 
    ... 
    END) AS [Unallocated Turnover], 
    123 AS [Credit Note Value] 
FROM tblreservation 

,然後UNPIVOT使用兩種方法的結果@ bluefeet的回答是:

SELECT 
    Caption, 
    Value 
FROM (
    SELECT 
    SUM(CASE WHEN Completed = 1 THEN 
     [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT + 
     OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT] 
    END) AS [Completed Turnover], 
    SUM(CASE WHEN InProgress = 1 THEN 
     ... 
    END) AS [In-progress Turnover], 
    SUM(CASE WHEN Completed = 0 AND InProgress = 0 THEN 
     ... 
    END) AS [Unallocated Turnover], 
    123 AS [Credit Note Value] 
    FROM tblreservation 
) AS s 
UNPIVOT (
    Value FOR Caption IN (
    [Completed Turnover], [In-progress Turnover], 
    [Unallocated Turnover], [Credit Note Value] 
) 
) AS u 
; 

在另一方面,如果InProgressCompleted總是1或0並且它們具有一致的值,因爲它們不能都是1,所以可以將結果分組爲這樣:

SELECT 
    Completed, 
    InProgress, 
    SUM(
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT + 
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT] 
) AS Value 
FROM tblreservation 
GROUP BY 
    Completed, 
    InProgress 

下一個步驟是將CompletedInProgress的組合轉換爲適當的標題。一種方法是使用CASE:

SELECT 
    CASE 
    WHEN Completed = 1 THEN 'Completed Turnover' 
    WHEN InProgress = 1 THEN 'In-progress Turnover' 
    ELSE      'Unallocated Turnover' 
    END AS Caption 
    SUM(
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT + 
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT] 
) AS Value 
FROM tblreservation 
GROUP BY 
    Completed, 
    InProgress 

然後你只用UNION ALL加入恆Credit Note Value

SELECT 
    CASE 
    WHEN Completed = 1 THEN 'Completed Turnover' 
    WHEN InProgress = 1 THEN 'In-progress Turnover' 
    ELSE      'Unallocated Turnover' 
    END AS Caption 
    SUM(
    [Fee Charge] + [Fee Charge VAT] + ExtraCharges + ExtraChargesVAT + 
    OtherCharges + OtherChargesVAT + WaitingCharge + [WaitingCharge VAT] 
) AS Value 
FROM tblreservation 
GROUP BY 
    Completed, 
    InProgress 

UNION ALL 

SELECT 
    'Credit Note Value', 
    123 
;