我有两个表VisitorsPerDay
和Languages
如下:
语言表
| 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语句并将其附加到动态查询中
我想知道是否有更好的方法来获取结果集,或者动态查询是否可以?
答案 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