使用动态 Pivot 时为列名添加前缀
Prefix column names when using dynamic Pivot
所以我正在研究一种方法来报告来自 table 的一些数据,这些数据跟踪患者在急诊室就诊时对胸痛问题的反应。当患者到达急诊室时,他们会被问到一系列有关胸痛的问题。对于每个问题,他们都被要求将疼痛从 1 到 10 进行排序。以下是存储在 table.
中的数据
+-----------+------------+----------+
| PatientId | QuestionId | PainRank |
+-----------+------------+----------+
| 1 | 1 | 5 |
+-----------+------------+----------+
| 1 | 2 | 6 |
+-----------+------------+----------+
| 1 | 3 | 4 |
+-----------+------------+----------+
| 2 | 1 | 1 |
+-----------+------------+----------+
| 2 | 2 | 8 |
+-----------+------------+----------+
| 2 | 3 | 2 |
+-----------+------------+----------+
| 3 | 1 | 5 |
+-----------+------------+----------+
| 3 | 2 | 4 |
+-----------+------------+----------+
| 3 | 3 | 7 |
+-----------+------------+----------+
我创建了一个动态数据透视表,它将问题更改为列,这样医生就可以查看一组患者的摘要。
+-----------+---+---+---+
| PatientId | 1 | 2 | 3 |
+-----------+---+---+---+
| 1 | 5 | 6 | 4 |
+-----------+---+---+---+
| 2 | 1 | 8 | 2 |
+-----------+---+---+---+
| 3 | 5 | 4 | 7 |
+-----------+---+---+---+
我想做的是在问题编号前加上单词 "Question",这样列就会看起来像 "Question - 1"、"Question - 2"、"Question - 3"。我想使用创建动态枢轴的 SQL 查询添加前缀,但由于枢轴是动态的,我不确定如何添加它。
这里是SQL我用来获取动态Pivot的
-- Dynamic Pivot
DECLARE @PivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnNameCollection AS NVARCHAR(MAX)
-- Get column list. A DISTINCT list of questions
SELECT @ColumnNameCollection= ISNULL(@ColumnNameCollection + ',','')
+ QUOTENAME(QuestionId)
FROM (SELECT DISTINCT QuestionId FROM PatientChestPain) AS Questions
-- Build PIVOT query using the list of questions
SET @PivotQuery =
N'SELECT PatientId, ' + @ColumnNameCollection + '
FROM PatientChestPain
PIVOT(MAX(PainRank)
FOR QuestionId IN (' + @ColumnNameCollection + ')) AS PivotTableResult'
--Execute the PIVOT query
EXEC sp_executesql @PivotQuery
我知道我可以编辑最终报告并添加 "Question - ",但是我正在尝试自动生成报告并且我只能操作 SQL.
注意:我使用 following website 生成 ascii tables。非常漂亮的界面,易于使用。我尝试创建 SQL Fiddle,但它似乎目前无法与 SQL 服务器一起使用。
我找到了一个简单的方法。只需创建一个 header 字符串,在其中为每一列创建一个别名
-- Dynamic Pivot
DECLARE @PivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnNameCollection AS NVARCHAR(MAX)
DECLARE @HeaderNameCollection AS NVARCHAR(MAX)
-- Get column list. A DISTINCT list of Questions
SELECT @ColumnNameCollection= ISNULL(@ColumnNameCollection + ',','')
+ QUOTENAME(QuestionId)
FROM (SELECT DISTINCT QuestionId FROM PatientChestPain) AS Questions
-- Get header list. A DISTINCT list of Questions
SELECT @HeaderNameCollection= ISNULL(@HeaderNameCollection + ',','')
+ QUOTENAME(QuestionId) + ' as Q' + CAST(QuestionId AS VARCHAR(16))
FROM (SELECT DISTINCT QuestionId FROM PatientChestPain) AS Questions
SELECT @ColumnNameCollection;
SELECT @HeaderNameCollection;
-- Build PIVOT query using the list of Questions
SET @PivotQuery =
N'SELECT PatientId, ' + @HeaderNameCollection + '
FROM PatientChestPain
PIVOT(MAX(PainRank)
FOR QuestionId IN (' + @ColumnNameCollection + ')) AS PivotTableResult'
--Execute the PIVOT query
SELECT @PivotQuery;
EXEC sp_executesql @PivotQuery
输出
所以我正在研究一种方法来报告来自 table 的一些数据,这些数据跟踪患者在急诊室就诊时对胸痛问题的反应。当患者到达急诊室时,他们会被问到一系列有关胸痛的问题。对于每个问题,他们都被要求将疼痛从 1 到 10 进行排序。以下是存储在 table.
中的数据+-----------+------------+----------+
| PatientId | QuestionId | PainRank |
+-----------+------------+----------+
| 1 | 1 | 5 |
+-----------+------------+----------+
| 1 | 2 | 6 |
+-----------+------------+----------+
| 1 | 3 | 4 |
+-----------+------------+----------+
| 2 | 1 | 1 |
+-----------+------------+----------+
| 2 | 2 | 8 |
+-----------+------------+----------+
| 2 | 3 | 2 |
+-----------+------------+----------+
| 3 | 1 | 5 |
+-----------+------------+----------+
| 3 | 2 | 4 |
+-----------+------------+----------+
| 3 | 3 | 7 |
+-----------+------------+----------+
我创建了一个动态数据透视表,它将问题更改为列,这样医生就可以查看一组患者的摘要。
+-----------+---+---+---+
| PatientId | 1 | 2 | 3 |
+-----------+---+---+---+
| 1 | 5 | 6 | 4 |
+-----------+---+---+---+
| 2 | 1 | 8 | 2 |
+-----------+---+---+---+
| 3 | 5 | 4 | 7 |
+-----------+---+---+---+
我想做的是在问题编号前加上单词 "Question",这样列就会看起来像 "Question - 1"、"Question - 2"、"Question - 3"。我想使用创建动态枢轴的 SQL 查询添加前缀,但由于枢轴是动态的,我不确定如何添加它。
这里是SQL我用来获取动态Pivot的
-- Dynamic Pivot
DECLARE @PivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnNameCollection AS NVARCHAR(MAX)
-- Get column list. A DISTINCT list of questions
SELECT @ColumnNameCollection= ISNULL(@ColumnNameCollection + ',','')
+ QUOTENAME(QuestionId)
FROM (SELECT DISTINCT QuestionId FROM PatientChestPain) AS Questions
-- Build PIVOT query using the list of questions
SET @PivotQuery =
N'SELECT PatientId, ' + @ColumnNameCollection + '
FROM PatientChestPain
PIVOT(MAX(PainRank)
FOR QuestionId IN (' + @ColumnNameCollection + ')) AS PivotTableResult'
--Execute the PIVOT query
EXEC sp_executesql @PivotQuery
我知道我可以编辑最终报告并添加 "Question - ",但是我正在尝试自动生成报告并且我只能操作 SQL.
注意:我使用 following website 生成 ascii tables。非常漂亮的界面,易于使用。我尝试创建 SQL Fiddle,但它似乎目前无法与 SQL 服务器一起使用。
我找到了一个简单的方法。只需创建一个 header 字符串,在其中为每一列创建一个别名
-- Dynamic Pivot
DECLARE @PivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnNameCollection AS NVARCHAR(MAX)
DECLARE @HeaderNameCollection AS NVARCHAR(MAX)
-- Get column list. A DISTINCT list of Questions
SELECT @ColumnNameCollection= ISNULL(@ColumnNameCollection + ',','')
+ QUOTENAME(QuestionId)
FROM (SELECT DISTINCT QuestionId FROM PatientChestPain) AS Questions
-- Get header list. A DISTINCT list of Questions
SELECT @HeaderNameCollection= ISNULL(@HeaderNameCollection + ',','')
+ QUOTENAME(QuestionId) + ' as Q' + CAST(QuestionId AS VARCHAR(16))
FROM (SELECT DISTINCT QuestionId FROM PatientChestPain) AS Questions
SELECT @ColumnNameCollection;
SELECT @HeaderNameCollection;
-- Build PIVOT query using the list of Questions
SET @PivotQuery =
N'SELECT PatientId, ' + @HeaderNameCollection + '
FROM PatientChestPain
PIVOT(MAX(PainRank)
FOR QuestionId IN (' + @ColumnNameCollection + ')) AS PivotTableResult'
--Execute the PIVOT query
SELECT @PivotQuery;
EXEC sp_executesql @PivotQuery
输出