将行转换为列,具体取决于来自另一个表的数据

时间:2019-07-15 04:00:47

标签: sql-server

我有两个表VisitorsPerDayLanguages如下:

语言

|         Code        |       Alias      |
|---------------------|------------------|
|          EN         |      English     |
|          AR         |      Arabic      |
|          FR         |      French      |
|          JP         |     Japanese     |

VisitorsPerDay 表格

|         Date        |  VisitorLanguage |    Count    |  
|---------------------|------------------|-------------|
|       10/1/2019     |        EN        |      20     |
|       10/1/2019     |        EN        |      10     |
|       10/1/2019     |        AR        |      5      |
|       15/1/2019     |        FR        |      1      |

结果应该是语言表中每天的汇总数据和每种语言的两列动态变化,如果添加了新语言,则无需编辑存储过程

|         Date        |    TotalVisits   |  En Visits  |  En AVG Visit %  |
|---------------------|------------------|-------------|------------------|
|       10/1/2019     |        35        |      30     |       85%        |
|       15/1/2019     |        1         |      0      |        0%        |

我要做的是创建一个动态查询和一个游标,这些游标遍历各种语言并为每种语言生成require SQL语句并将其附加到动态查询中

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

1 个答案:

答案 0 :(得分:0)

您必须使用Dynamic 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