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
更好的定义?它是否及时完成了您希望它完成的工作?