Sql server 根据另一个表中的数据将行数据透视到列

Sql server 根据另一个表中的数据将行数据透视到列,sql-server,Sql Server,我有两个表VisitorsPerDay和Languages,如下所示: 语言表 | Code | Alias | |---------------------|------------------| | EN | English | | AR | Arabic | | FR | French

我有两个表
VisitorsPerDay
Languages
,如下所示:

语言表

|         Code        |       Alias      |
|---------------------|------------------|
|          EN         |      English     |
|          AR         |      Arabic      |
|          FR         |      French      |
|          JP         |     Japanese     |
|         Date        |  VisitorLanguage |    Count    |  
|---------------------|------------------|-------------|
|       10/1/2019     |        EN        |      20     |
|       10/1/2019     |        EN        |      10     |
|       10/1/2019     |        AR        |      5      |
|       15/1/2019     |        FR        |      1      |
访客日表格

|         Code        |       Alias      |
|---------------------|------------------|
|          EN         |      English     |
|          AR         |      Arabic      |
|          FR         |      French      |
|          JP         |     Japanese     |
|         Date        |  VisitorLanguage |    Count    |  
|---------------------|------------------|-------------|
|       10/1/2019     |        EN        |      20     |
|       10/1/2019     |        EN        |      10     |
|       10/1/2019     |        AR        |      5      |
|       15/1/2019     |        FR        |      1      |
结果应该是每天的聚合数据和languages表中每种语言的两列,如果在其中添加了新语言,则无需编辑存储过程

|         Date        |    TotalVisits   |  En Visits  |  En AVG Visit %  |
|---------------------|------------------|-------------|------------------|
|       10/1/2019     |        35        |      30     |       85%        |
|       15/1/2019     |        1         |      0      |        0%        |
我所做的是创建一个动态查询和一个游标,该游标在语言上循环,为每种语言生成requiresql语句,并将其附加到动态查询中


我想知道的是,有没有更好的方法来获取结果集,或者动态查询可以吗?

您必须使用
动态SQL
,查询将很难看并且不容易维护

declare @sql    nvarchar(max)

select  @sql    = isnull(@sql + ',', 'SELECT [Date], TotalVisits = sum([Count]),' + char(13))
        + 'SUM(CASE WHEN VisitorLanguage = ''' + Code + ''' THEN [Count] END) AS [' + Code + ' Visits],'+ char(13)
        + 'SUM(CASE WHEN VisitorLanguage = ''' + Code + ''' THEN [Count] END) * 100 / SUM([Count]) AS [' + Code + ' AVG Visits %]'+ char(13)
from    Languages

select  @sql    = @sql + 'FROM VisitorsPerDay GROUP BY [Date]'

--  print out the dynmamic query
print   @sql
exec    sp_executesql @sql

更好的定义?它是否及时完成了您希望它完成的工作?