2017-10-10 83 views
1

我可以設法使SQL Server作爲下方的動態支點查詢:末添加總計列,爲動態透視SQL Server查詢

DECLARE @sql nvarchar(max), 
     @columns nvarchar(max) 

SELECT @columns = STUFF((SELECT DISTINCT ',' + QUOTENAME(nationality) 
         FROM NewComers 
         FOR XML PATH('')), 1, 1, '') 

SELECT @sql = 'SELECT p.registrationdate, '+ @columns + 
       ' FROM (SELECT s.registrationdate, s.Nationality FROM newcomers s) AS t 
       PIVOT (
        COUNT(Nationality) FOR nationality IN (' + @columns+ ')) p' 

EXEC (@sql) 

我的問題是,我想在添加一列結果的結尾。所以,目前我得到這樣的結果:

registrationdate GER TUR CAN AUS 
------------------ ----- ----- ----- ----- 
    16/11/2016   10  8  6  7 
    21/08/2020   4  5  3  2 
    08/04/2019   1  3  5  0 

,我需要有這樣的結果:

registrationdate GER TUR CAN AUS Total 
------------------ ----- ----- ----- ----- ------- 
    16/11/2016   10  8  6  7  31 
    21/08/2020   4  5  3  2  14 
    08/04/2019   1  3  5  0  9 

我試圖在堆棧溢出幾個解決方案,但我沒有相當的工作。

會感謝你的幫助:)

+0

而不是你的數據的圖片,你可以發佈你的實際數據? http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+1

感謝您的鏈接。我編輯了這個問題。 – Hajir

回答

0

你能加總與你的新人的表被聯合行,然後手動添加的「總計」串到你的@columns變量?

基本上創建一個新工會表的CTE與工會按照您的日期進行分組並總計總和並將「總計」一詞粘貼到國籍欄中。

然後只需將Total添加到您的@columns字符串中即可將其轉出。

這樣的事情?我目前無法訪問SQL Server來測試它。

 
DECLARE @sql nvarchar(max), 
     @columns nvarchar(max) 

SELECT @columns = STUFF((SELECT DISTINCT ',' + QUOTENAME(nationality) 
         FROM NewComers 
         FOR XML PATH('')), 1, 1, '') 

SELECT @sql = ' 

;with CTE as (
select registrationdate, Nationality, count(Nationality) as Cnt from newcomers group by registrationdate, Nationality 
union all 
select registrationdate, ''Total'', count(Nationality) as Cnt from newcomers group by registrationdate 
) 

SELECT p.registrationdate, '+ @columns + ', Total' + 
       ' FROM (SELECT registrationdate, Nationality, Cnt FROM CTE) AS t 
       PIVOT (
        max(Cnt) FOR nationality IN (' + @columns+ ',Total)) p' 

EXEC (@sql) 
+0

非常感謝你:)它的工作原理。只有在所有工會結束之後,「總計」才應改爲「總計」。 – Hajir

+0

好的。或者兩個單引號也可以。您可以用另一個單引號轉義單引號。 – thomas