Reputation: 202
This is my SQL statement
select id , name, type, value from table1 a
INNER JOIN table2 b on a.id = b.id
where b.type in ('display','contact','ship')
which produces below result
ID name type value
5 test display display1
5 test contact contact1
5 test ship ship1
6 test2 display display2
6 test2 contact contact2
6 test2 ship ship2
I need to get result in kind of pivoted format like this
id name display contact ship
5 test display1 contact1 ship1
6 test2 display2 contact2 ship2
I tried this solution : https://stackoverflow.com/a/6849706/2645738 ,but its giving me the same result (3 rows for each data). It's like i need to group by id and name,but don't know how to make display,contact,ship as columns.
Would you please help me for the same.
Upvotes: 1
Views: 92
Reputation: 1
select id,name,[display],[contact],[ship]
from #b
pivot(max(value) for type in([display],[contact],[ship])) As d
Upvotes: 0
Reputation: 43666
If you want PIVOT
:
DECLARE @DataSource TABLE
(
[id] TINYINT
,[name] VARCHAR(12)
,[type] VARCHAR(12)
,[value] VARCHAR(12)
);
INSERT INTO @DataSource ([id], [name], [type], [value])
VALUES (5, 'test', 'display', 'display1')
,(5, 'test', 'contact', 'contact1')
,(5, 'test', 'ship', 'ship1')
,(6, 'test2', 'display', 'display2')
,(6, 'test2', 'contact', 'contact2')
,(6, 'test2', 'ship', 'ship2');
SELECT *
FROM @DataSource
PIVOT
(
MAX([value]) FOR [type] IN ([display], [contact], [ship])
) PVT;
Upvotes: 2
Reputation: 50173
It is necessary to use PIVOT
you could also do that by using simple case
expression
SELECT ID,
Name,
MAX(CASE([type]) WHEN 'display' THEN value END) [display],
MAX(CASE([type]) WHEN 'contact' THEN value END) [contact],
MAX(CASE([type]) WHEN 'ship' THEN value END) [ship]
FROM <table> GROUP BY ID, Name
Result :
ID Name display contact ship
5 test display1 contact1 ship1
6 test2 display2 contact2 ship2
Upvotes: 4
Reputation: 8043
This Worked for me
WITH T
AS
(
SELECT
id ,
name,
type,
value
FROM table1 a
INNER JOIN table2 b
ON a.id = b.id
WHERE b.type in ('display','contact','ship')
)
SELECT
*
FROM T
PIVOT
(
MAX([Value])
FOR
[Type] IN
(
[display],[Contact],[Ship]
)
)PVT
Check the SQLFiddle
Upvotes: 2
Reputation: 72225
This query should give you the results you want:
select a.id , a.name,
max(case when b.type = 'display' then value end) as display,
max(case when b.type = 'contact' then value end) as contact,
max(case when b.type = 'ship' then value end) as ship
from table1 a
INNER JOIN table2 b on a.id = b.id
where b.type in ('display','contact','ship')
group by a.id, a.name
Upvotes: 2