我在Oracle 11g中有3个字段的表:
STUDYID | STUDY_PARAMETER | STUDY_VALUE
5268 | Age Group | ADULT (18-65)
5269 | Age Group | ADULT (18-65)
5270 | Age Group | ADULT (18-65)
5271 | Age Unit | ADULT (18-65)
1668A | Trial Type | ADULT (18-65)
5273 | Trial Type | Dispensing
5345 | Age Unit | Years
1668AC | Age Group | ADULTS (18-39)
所以,我需要的是按以下顺序显示值:
STUDY_ID | AGE_GROUP | AGE_UNIT | TRIAL_TYPE
5268 | ADULT (18-65) | Years | Dispensing
5269 | ADULT (18-65) | (null) | (null)
1668AC | ADULTS (18-39)| Years | Non - Dispensing
等等。
到目前为止我所拥有的是:
SELECT *
FROM (
SELECT STUDYID, STUDY_VALUE, STUDY_PARAMETER
FROM RD.STUDY_INFO
)
PIVOT (
SUM(STUDY_VALUE)
FOR (STUDY_PARAMETER)
IN (
'Age Unit' AS AGE_UNIT,
'Age Group' AS AGE_GROUP,
'Trial Type' AS TRIAL_TYPE
)
);
我是从网上的例子中学到的,但我不确定我是否可以像这样使用SUM()......?
我收到此错误:
ORA-01722: invalid number
01722. 00000 - "invalid number"
有人看到我做错了吗?
答案 0 :(得分:2)
由于STUDY_VALUE
列似乎是字符串,因此您需要在值上使用max()
或min()
聚合函数:
SELECT *
FROM
(
SELECT STUDYID, STUDY_VALUE, STUDY_PARAMETER
FROM STUDY_INFO
)
PIVOT
(
MAX(STUDY_VALUE)
FOR (STUDY_PARAMETER) IN ('Age Unit' AS AGE_UNIT,
'Age Group' AS AGE_GROUP,
'Trial Type' AS TRIAL_TYPE)
);
答案 1 :(得分:2)
您可以尝试此查询。
SELECT
ID,
MAX(Case When parameter='Age Group' then Value else '0' end) AS AgeGroup,
MAX(Case When parameter='Trial Type' then Value else '0'end)AS TrialType,
MAX(Case When parameter='Age Unit' then Value else '0'end)AS AgeUnit
FROM teststack
GROUP BY ID
ORDER BY ID