【问题标题】:Dynamic Pivot to show how voters voted动态枢轴显示选民如何投票
【发布时间】:2012-07-11 13:41:34
【问题描述】:

这是表结构:

Election
ElectionId ElectionName
1          12P
2          11G

History
ElectionId VoterId HowVoted
1          1       Rep
2          2       Dem
1          2       Non 

Voter
VoterId VoterName
1       Bill Smith
2       John Hearst

我想要这样的输出:

VoterName   12P  11P  note: Election names change so need to be pivoted dynamically
Bill Smith  Rep  Null
John Hearst Non  Dem    

我基本上需要将 ElectionNames 转为 Column Names,然后显示选民如何在行中投票。建议?谢谢!

【问题讨论】:

  • 请显示样本数据和所需结果。另外,请使用{} 正确突出代码示例而不是<br> 标签。
  • 你没有显示你尝试了什么?

标签: sql-server tsql sql-server-2005 pivot


【解决方案1】:

您可以像这样使用动态 SQL 来做到这一点:

-- Get column names
DECLARE @Columns VARCHAR(MAX);  SET @Columns = '';
SELECT @Columns = @Columns + ', [' + ElectionName + ']' FROM Election;
SET @Columns = SUBSTRING(@Columns, 3, LEN(@Columns)) -- Remove the leading ', '

-- Declare dynamic SQL
DECLARE @sql VARCHAR(MAX);
SET @sql = 'WITH CTE AS
(
    SELECT VoterName, ElectionName, HowVoted
    FROM Election e
        INNER JOIN History h ON e.ElectionId = h.ElectionId
        INNER JOIN Voter v ON v.VoterId = h.VoterId
)
SELECT [VoterName], ' + @Columns + 'FROM CTE
PIVOT (MAX(HowVoted) FOR ElectionName IN ('+ @Columns + ')) AS p'

-- Run dynamic SQL
EXEC(@sql)

【讨论】:

  • 谢谢,它有效!后续问题,如果我需要在 CTE 中添加 where 子句,例如 WHERE PRECINCTID = @PrecinctId。我是否因此而对注射攻击敞开心扉?如果是这样,有解决办法吗?
  • 带参数看看sp_executesql
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多