【发布时间】:2016-05-09 22:11:31
【问题描述】:
我对动态 SQL 非常陌生,我正在尝试构建一个查询来报告我们的工作人员、他们拥有哪些证书以及他们存在的最后一个证书的到期日期。我的临时表包含正确的数据,我的动态列字符串似乎是正确的。当一切运行时,列标题按预期显示,人员姓名正确分组,但没有显示任何日期,值全部为 NULL。前两个部分的具体代码我没有放,因为选择标准有点啰嗦。
对于动态列变量,SELECT STUFF(@columns, 1, 1, '') 返回下面的单个值。
[Air Supervisor - AODC], [Air Supervisor - IMCA], [ALST - Certificate of Achievement], [ALST - IMCA], [Competence - A1/A2 Competent Assessor], [Competence - Air Diver-Surface Supplied], etc...
数据本身保存在一个临时表中,SELECT * FROM #results 给出了以下(示例)输出。这是与最近到期日期的相关人员 ID 匹配的每个证书。
id cert date
3484 [ALST - Banksman and Slinging] 28/07/2029
3648 [ALST - Banksman and Slinging] 05/11/2099
3701 [ALST - Banksman and Slinging] 27/05/2029
3740 [ALST - Banksman and Slinging] 20/01/2055
1181 [ALST - Crane Operators] 31/12/2029
1137 [ALST - Crane Operators] 31/12/2029
1072 [ALST - Crane Operators] 31/12/2029
以下是实际的数据透视查询。我需要上面的 [cert] 字段成为列标题,日期(它们存在的地方)成为值和与正确名称匹配的人员 ID。
SET @dynamicpivot =
N'SELECT pd.name, ' + STUFF(@columns, 1, 1, '') + '
FROM #results
PIVOT (MAX([date]) FOR [cert] IN (' + STUFF(@columns, 1, 1, '') + ')) as ce
JOIN dbo.personnel as pd
ON pd.person_id = ce.id
ORDER BY pd.name'
EXEC sp_executesql @dynamicpivot
查询运行没有错误,列名显示正确,人员姓名按顺序和分组显示,但没有显示日期,全为 NULL。
我尽量保持简洁,如果您需要更多信息,请告诉我。
【问题讨论】:
标签: sql-server dynamic pivot