mdc
mdc

Reputation: 1201

Joining two select queries from the same table

The table contains an ID column, valueHeading column and a value column. I want to separate the value column into two new columns called valueHeading1 and valueHeading2 depending on which type of valueHeading the value has.

So I want to join this select: Edit: Full join

SELECT ID
      ,valueHeading
      ,value as 'valueHeading1'
FROM table1
WHERE valueHeading = 'valueHeading1'

With This select:

SELECT ID
      ,value as 'valueHeading2'
FROM table1
WHERE valueHeading = 'valueHeading2'

on their respective ID's. How do I do this?

Edit to illustrate what I want to do:

Original table:

ID    valueHeading    value
0     valueHeading1    a
0     valueHeading2    a
1     valueHeading1    ab
1     valueHeading2    NULL
2     valueHeading1    abcd
2     valueHeading2    abc

New Table:

ID    valueHeading1    valueHeading2
0          a               a
1          ab              NULL
2         abcd             abc

Upvotes: 7

Views: 40660

Answers (4)

Ghost Developer
Ghost Developer

Reputation: 1433

self join could be a simple solution

SELECT DISTINCT t1.ID, t1.value as valueHeading1, t2.value as valueHeading2, 
FROM table1 t1
INNER JOIN table1 t2 ON t1.ID = t2.ID
WHERE t1.valueHeading <> t2.valueHeading

Upvotes: 0

hkutluay
hkutluay

Reputation: 6944

If you need only join use this. Using case when is elegant way if you don't need join.

SELECT * FROM 
    (SELECT ID
          ,valueHeading
          ,value as 'valueHeading1'
    FROM table1
    WHERE valueHeading = 'valueHeading1') AS TAB_1, 
    (SELECT ID
          ,value as 'valueHeading2'
    FROM table1
    WHERE valueHeading = 'valueHeading2') AS TAB_2
    WHERE TAB_1.ID = TAB_2.ID

Upvotes: 8

Oleksandr Fedorenko
Oleksandr Fedorenko

Reputation: 16894

In SQLServer2005+ possible use PIVOT

SELECT ID, valueHeading1, valueHeading2
FROM
(
 SELECT *
 FROM dbo.test28
 WHERE valueHeading IN ('valueHeading1', 'valueHeading2')
 ) x
 PIVOT
 (
  MAX(value)
  FOR valueHeading IN ([valueHeading1], [valueHeading2])
  ) p

Demo on SQLFiddle

Upvotes: 3

xlecoustillier
xlecoustillier

Reputation: 16351

Try something like :

SELECT ID
      , CASE WHEN valueHeading = 'valueHeading1' THEN value ELSE NULL END AS valueHeading1
      , CASE WHEN valueHeading = 'valueHeading2' THEN value ELSE NULL END AS valueHeading2
FROM table1
WHERE valueHeading IN ('valueHeading1', 'valueHeading2')

If you want to regroup all values on one row for each ID, you can try :

SELECT ID
      , MAX(CASE WHEN valueHeading = 'valueHeading1' THEN value ELSE NULL END) AS valueHeading1
      , MAX(CASE WHEN valueHeading = 'valueHeading2' THEN value ELSE NULL END) AS valueHeading2
FROM table1
WHERE valueHeading IN ('valueHeading1', 'valueHeading2')
GROUP BY ID
HAVING MAX(CASE WHEN valueHeading = 'valueHeading1' THEN value ELSE NULL END) IS NOT NULL
OR MAX(CASE WHEN valueHeading = 'valueHeading2' THEN value ELSE NULL END) IS NOT NULL

See SQLFiddle. I also tried on Oracle 11g and MSSQL 2012, and it works each time.

Upvotes: 5

Related Questions