1

我可以设法在 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  

我在 Stack Overflow 中尝试了几种解决方案,但都没有奏效。

将感谢您的帮助:)

4

1 回答 1

1

您可以将 Total 作为联合行添加到您的 newcomer 表中,然后手动将“Total”字符串添加到您的 @columns 变量中吗?

基本上创建一个新人表的 CTE,其中包含一个按您的日期分组并汇总总数并将“总计”一词粘贴到国籍列中的联合。

然后只需将 Total 添加到您的 @columns 字符串中即可将其转出。

像这样的东西?我目前无权访问 SQL Server 来测试它。

声明 @sql nvarchar(max),
        @columns nvarchar(最大值)

SELECT @columns = STUFF((SELECT DISTINCT ',' + QUOTENAME(国籍)
                         来自新人  
                         FOR XML PATH('')), 1, 1, '')

选择@sql = '

;CTE 为 (
 按注册日期、国籍从新人组中选择注册日期、国籍、计数(国籍)作为Cnt
 联合所有
 选择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
                枢轴 (
                    max(Cnt) FOR 国籍 IN (' + @columns+ ',Total)) p'

执行 (@sql)
于 2017-10-10T13:58:52.347 回答