在SQL中将值拆分为两列

时间:2019-07-12 19:02:44

标签: sql oracle

我有一个表,用于根据代码存储车辆的VIN码和交货日期。我希望能够获得包含三列数据的一行。

我尝试了以下

SELECT DISTINCT VIN, MAX(TRANSACTION_DATE) AS DELIVERY_DATE
  FROM "TABLE"
 WHERE DELIVERY_TYPE ='025'
   AND VIN IN ('XYZ')
 GROUP BY VIN
UNION ALL
SELECT VIN, MAX(TRANSACTION_DATE) AS OTHER_DELIVERY_DATE
  FROM "TABLE"
 WHERE DELIVERY_TYPE !='025'
   AND VIN IN ('XYZ')
 GROUP BY VIN;

When I run this I get

 VIN  DELIVERY_DATE
 XYZ    26-dec-18
 XYZ    01-MAY-19

current data format in table:

 VIN  TRANSACTION_DATE
 XYZ      26-DEC-18
 XYZ      01-MAY-19

Required format:

 VIN   DELIVERY_DATE   OTHER_DELIVERY DATE
 XYZ      26-DEC-18           01-MAY-19

3 个答案:

答案 0 :(得分:1)

使用conditional aggregation

SELECT  VIN,
        MAX (CASE WHEN DELIVERY_TYPE ='025' AND
                       VIN IN ('XYZ') then TRANSACTION_DATE end) AS DELIVERY_DATE
        MAX(CASE WHEN DELIVERY_TYPE !='025' AND
                       VIN IN ('XYZ') then TRANSACTION_DATE end) AS OTHER_DELIVERY
  FROM "TABLE"     
 GROUP BY VIN

答案 1 :(得分:0)

只需使用条件聚合:

SELECT VIN,
       MAX(CASE WHEN DELIVERY_TYPE = 25 THEN TRANSACTION_DATE END) AS DELIVERY_DATE,
       MAX(CASE WHEN DELIVERY_TYPE <> 25 THEN TRANSACTION_DATE END) AS TRANSACTION_DATE
FROM TABLE
WHERE VIN IN ('XYZ')
GROUP BY VIN;

请注意,SELECT DISTINCT几乎从未与GROUP BY一起使用。

答案 2 :(得分:0)

您可以使用CROSS APPLY

DECLARE @Cars TABLE (VIN VARCHAR(100), DELIVERY_TYPE VARCHAR(3), TRANSACTION_DATE DATE)
INSERT INTO @Cars
(VIN, DELIVERY_TYPE , TRANSACTION_DATE)
VALUES
('XYZ', '025', '20181226'), ('XYZ', '030', '20190319')

我需要上面的代码才能在没有表和数据的情况下运行,您所需要做的就是:

SELECT DISTINCT C.VIN, DD.DELIVERY_DATE, TD.TRANSACTION_DATE
    FROM @Cars C
    CROSS APPLY (SELECT MAX(TRANSACTION_DATE) DELIVERY_DATE FROM @Cars D WHERE D.DELIVERY_TYPE = '025' AND D.VIN = C.VIN) DD
    CROSS APPLY (SELECT MAX(TRANSACTION_DATE) TRANSACTION_DATE FROM @Cars D WHERE D.DELIVERY_TYPE = '025' AND D.VIN = C.VIN) TD

如果您需要传输的不是两个,而是更多的列,我建议使用PIVOT TABLE更为合适,但是对于两列,CROSS APPLY或条件聚合都可以解决问题。