简体   繁体   中英

Select values from different rows in one row

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?

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

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

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' 

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM