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
我正在尝试执行 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