ERROR: Unsupported PIVOT column type: text

ERROR: Unsupported PIVOT column type: text

我正在尝试执行 PIVOT 但出现错误。我试图查看哪些患者接受了不止一次间歇训练。该列是文本类型。我试图在查询中将列类型转换为 VARCHAR(MAX),但仍然出现错误。

这是我的代码:

SELECT patientname, IntervalName1, IntervalName2, IntervalName3
  FROM (SELECT DISTINCT 
               patientname,
               CAST(IntervalName AS VARCHAR(MAX)),
               'IntervalName' +
                CAST(ROW_NUMBER() OVER 
                    (PARTITION BY patientname
                         ORDER BY patientname) AS VARCHAR(10)) AS ColumnSequence
          FROM vwPatientPEIOutcomes
         WHERE [ vwPatientPEIOutcomes.DueDate = daterange ]
         GROUP BY patientname, IntervalName
         ORDER BY patientname, ColumnSequence) Temp
PIVOT(
      MAX(patientname) FOR 
         ColumnSequence IN ( IntervalName1, IntervalName2, IntervalName3 )
     ) tb2

下面是我针对您的回答进行的第二组编辑。我是新手,所以花了一些时间弄清楚需要什么:

感谢您的回答。我使用分组依据是因为 row_number 正在创建重复项,我想不出还有什么办法可以避免这种情况发生。

患者姓名和区间名称在数据库中都是字符串。 Intervalname 是一个字段,表示他们是否在给定的时间范围内接受了问卷调查。我正在尝试为每个患者创建一行。

这是数据集:

CREATE TABLE vwPatientPEIOutcomes (
  patientname varchar(max) NOT NULL,
  intervalname varchar(max) NOT NULL,
  ) ;
   INSERT INTO vwpatientPEIOutcomes (patientname,intervalname) 
  VALUES
  ('Patient 1','End'),
  ('Patient 2','Start'),
  ('Patient 3','Start'),
  ('Patient 4','End'),
  ('Patient 4','6-Month'),
  ('Patient 4','Start'),
  ('Patient 5','6-Month'),
  ('Patient 6','Start'),
  ('Patient 6','End'),
  ('Patient 7','6-Month');

我正在努力得到这个结果:

patientname Intervalname1 Intervalname2 Intervalname3
Patient 1 End
Patient 2 Start
Patient 3 Start
Patient 4 End 6-Month Start
Patient 5 6-Month
Patient 6 End Start
Patient 7 6-Month

SQL 引擎可能在抱怨 GROUP BY 子句中的引用。将其更改为

GROUP BY patientname, CAST(IntervalName as varchar(max))

不过,在没有聚合的情况下使用 GROUP BY 很奇怪。

而且我不确定您使用的寡妇函数是否在正确的上下文中。 ORDER BY 似乎没有意义。

我可以确定您是否发布了生成 table 和样本数据的代码。

您可以使用 条件聚合 在通过使用 ROW_NUMBER() window 子查询中的函数(例如

SELECT patientname, 
       MAX(CASE WHEN rn = 1 THEN intervalname END) AS intervalname1,
       MAX(CASE WHEN rn = 2 THEN intervalname END) AS intervalname2,
       MAX(CASE WHEN rn = 3 THEN intervalname END) AS intervalname3
  FROM
  ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY patientname
                                      ORDER BY patientname) AS rn
      FROM vwPatientPEIOutcomes ) AS p
 GROUP BY patientname
 ORDER BY patientname

Demo