【问题标题】:Prefix column names when using dynamic Pivot使用动态 Pivot 时为列名添加前缀
【发布时间】:2016-10-14 21:40:27
【问题描述】:

因此,我正在研究一种方法来报告表格中的一些数据,该表格可跟踪患者在急诊室就诊时对胸痛问题的反应。当患者到达急诊室时,他们会被问到一系列有关胸痛的问题。对于每个问题,他们被要求从 1 到 10 对疼痛进行排名。下面是存储在表格中的数据。

+-----------+------------+----------+
| 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 |
+-----------+---+---+---+

我想做的是在问题编号前加上“问题”一词,这样列就会看起来像“问题 - 1”、“问题 - 2”、“问题 - 3”。我想使用创建动态数据透视的 SQL 查询添加前缀,但由于数据透视是动态的,我不确定如何添加它。

这是我用来获取动态 Pivot 的 SQL。

  -- 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

我确实意识到我可以只编辑最终报告并添加“问题 -”,但是我正在尝试自动生成报告并且我只能操作 SQL。

注意:我使用following website 生成 ascii 表。非常漂亮的界面和易于使用。我尝试创建一个 SQL Fiddle,但它似乎目前无法与 SQL Server 一起使用。

【问题讨论】:

  • 仅供参考。我使用 SqlFiddle 创建 DDL 语句,并使用 rextester,com 创建 fiddle。

标签: sql sql-server-2008 pivot


【解决方案1】:

我找到了一个简单的方法。只需创建一个标题字符串,在其中为每列创建一个别名

DEMO

  -- 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

输出

【讨论】:

  • 如果我理解所有内容,您只需将'Question - ' 添加到有问题的两行。我收到一条错误消息,提示 Incorrect syntax near 'Question'.
  • 很棒的答案。它不仅有效,而且描述得很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 2020-03-27
相关资源
最近更新 更多