Oracle Pivot - converting values into columns

混江龙づ霸主 提交于 2019-12-28 04:34:06

问题


I have table in Oracle 11g with 3 fields:

 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)

So, what I need is to display values in this order:

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

and so on.

What I have so far is:

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

I learned this from examples on the net but I am not sure if I can use SUM() like this...?!

I get this error:

ORA-01722: invalid number
01722. 00000 -  "invalid number"

Does anyone see what I am doing wrong?


回答1:


Since the STUDY_VALUE column appears to be a string, you will need to use either the max() or min() aggregate function on the values:

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

See SQL Fiddle with Demo




回答2:


You can try this query.

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


来源:https://stackoverflow.com/questions/17116354/oracle-pivot-converting-values-into-columns

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!