1

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
  • I tried using MAX() aggregate fun and it seems like it is working. im testing it right now. Commented Jun 14, 2013 at 20:14

2 Answers 2

3

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

Sign up to request clarification or add additional context in comments.

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.