Reputation: 401
I have two tables:
CREATE TABLE MAIN (
[ID] INT PRIMARY KEY,
[TIMESTAMP] DATETIME,
[NAME] VARCHAR(15)
);
CREATE TABLE SEC (
[ID] INT PRIMARY KEY,
[TIMESTAMP] DATETIME,
[VAL] INT,
[TYPE] VARCHAR(10)
);
I would like to select values from both tables. Data in second table has a different values in type
column but has the same timestamp as the main
table data.
SELECT M.[TIMESTAMP], [NAME], [VAL] AS 'VAL_TYPE_1', [VAL] AS 'VAL_TYPE_2'
FROM MAIN M
LEFT JOIN SEC S ON M.TIMESTAMP = S.TIMESTAMP
WHERE S.TYPE = 'TYPE_1' OR S.TYPE = 'TYPE_2';
For all timestamps from main
table I would like to get name and value of the TYPE_1
(NULL if it does not exist) and value of the TYPE_2
(or NULL if it does not exist). What should I change?
Upvotes: 0
Views: 2152
Reputation: 29647
This is often done via a CASE
For example:
SELECT M.[TIMESTAMP], M.[NAME],
CASE WHEN S.TYPE = 'TYPE_1' THEN S.[VAL] END AS [VAL_TYPE_1],
CASE WHEN S.TYPE = 'TYPE_2' THEN S.[VAL] END AS [VAL_TYPE_2]
FROM MAIN M
LEFT JOIN SEC S ON M.TIMESTAMP = S.TIMESTAMP
WHERE S.TYPE IN('TYPE_1','TYPE_2');
And if you want to group by on the TIMESTAMP and NAME, that's also possible
SELECT M.[TIMESTAMP], M.[NAME],
MAX(CASE WHEN S.TYPE = 'TYPE_1' THEN S.[VAL] END) AS [VAL_TYPE_1],
MAX(CASE WHEN S.TYPE = 'TYPE_2' THEN S.[VAL] END) AS [VAL_TYPE_2]
FROM MAIN M
LEFT JOIN SEC S ON M.TIMESTAMP = S.TIMESTAMP
WHERE S.TYPE IN('TYPE_1','TYPE_2')
GROUP BY M.[TIMESTAMP], M.[NAME];
Upvotes: 1
Reputation: 6008
I guess you need something like:
SELECT M.[TIMESTAMP],
[NAME],
T1.[VAL] AS 'VAL_TYPE_1',
T2.[VAL] AS 'VAL_TYPE_2'
FROM MAIN M
LEFT OUTER JOIN SEC T1
ON M.TIMESTAMP = T1.TIMESTAMP
AND T1.TYPE = 'TYPE_1'
LEFT OUTER JOIN SEC T2
ON M.TIMESTAMP = T2.TIMESTAMP
AND T2.TYPE = 'TYPE_2';
Upvotes: 0
Reputation: 2014
You can get this by simple union query i think. Hope this helps
SELECT M.[TIMESTAMP], [NAME], [VAL] AS 'VAL_TYPE_1', NULL 'VAL_TYPE_2'
FROM MAIN M
LEFT JOIN SEC S ON M.TIMESTAMP = S.TIMESTAMP
WHERE S.TYPE = 'TYPE_1'
UNION ALL
SELECT M.[TIMESTAMP], [NAME], NULL 'VAL_TYPE_1' , [VAL] AS 'VAL_TYPE_2'
FROM MAIN M
LEFT JOIN SEC S ON M.TIMESTAMP = S.TIMESTAMP
WHERE S.TYPE = 'TYPE_2'
Upvotes: 0
Reputation: 2809
if i undstood right, you need something like this:
SELECT M.[TIMESTAMP]
,M.[NAME]
,S1.[VAL] AS 'VAL_TYPE_1'
,S2.[VAL] AS 'VAL_TYPE_2'
FROM MAIN M
LEFT JOIN SEC S1 ON M.TIMESTAMP = S1.TIMESTAMP
AND S1.TYPE = 'TYPE_1'
LEFT JOIN SEC S2 ON M.TIMESTAMP = S2.TIMESTAMP
AND S2.TYPE = 'TYPE_2';
Upvotes: 0