2017-10-10 66 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