Как вы разделяете строки в одной таблице на столбцы? - PullRequest
0 голосов
/ 04 мая 2018

Допустим, у меня есть очень простая таблица, подобная этой:

enter image description here

И я хочу запрос, чтобы вернуть эти данные в 1 строку, например:

enter image description here

Как мне это сделать? Вот что я пробовал до сих пор:

SELECT
    od.OrderNo,
    CASE
        WHEN od.PartNo LIKE 'CAD%' THEN od.PartNo
        END AS [Part1],
    CASE
        WHEN od.PartNo LIKE 'CAD%' THEN od.DueDate
        END AS [DueDate1],
    CASE
        WHEN od.PartNo LIKE 'WISH%' THEN od.PartNo
        END AS [Part2],
    CASE
        WHEN od.PartNo LIKE 'WISH%' THEN od.DueDate
        END AS [DueDate2]
FROM OrderDet od
WHERE od.OrderNo = '20352E'
    AND (od.PartNo LIKE 'CAD%'
    OR od.PartNo LIKE 'WISH%')

В результате я получаю следующий результат:

enter image description here

Я также попытался самостоятельно присоединиться, как это:

SELECT
    od.OrderNo,
    od.PartNo AS [Part1],
    od.DueDate AS [DueDate1],
    od2.PartNo AS [Part2],
    od2.DueDate AS [DueDate2]
FROM OrderDet od
    JOIN OrderDet od2 ON od.OrderNo = od2.OrderNo
WHERE od.OrderNo = '20352E'
    AND (od.PartNo LIKE 'CAD%'
    OR od2.PartNo LIKE 'WISH%')

Это тоже не сработало, однако мне нужна строка 8, просто я не уверен, как ее изолировать, результат следующий:

enter image description here

Так есть ли способ сделать то, что я хочу, и показать это в 1 строке? Не могу обернуть мою голову вокруг этого. Любая помощь приветствуется, спасибо

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Как насчет этого:

SELECT
    OrderNo,
    (SELECT  MAX(PartNo) FROM OrderDet) AS [Part1],
    (SELECT  MAX(DueDate) FROM OrderDet) AS [DueDate1],
    (SELECT  MIN(PartNo) FROM OrderDet) AS [Part2],
    (SELECT  MIN(DueDate) FROM OrderDet) AS [DueDate2]
FROM OrderDet
WHERE od.OrderNo = '20352E'
    AND (od.PartNo LIKE 'CAD%'
    OR od2.PartNo LIKE 'WISH%')
GROUP BY OrderNo
0 голосов
/ 04 мая 2018

Используйте group by предложение и выполните условное агрегирование

select OrderNo,
       max(case when PartNo LIKE 'CAD%' then 'CAD' end) as PartNo1,
       max(case when PartNo LIKE 'CAD%' then DueDate end) as DueDate1,
       max(case when PartNo LIKE 'WISH%' then 'WISH' end) as PartNo2,
       max(case when PartNo LIKE 'WISH%' then DueDate end) as DueDate2
from OrderDet o
where OrderNo = '20352E' and 
      (PartNo LIKE 'CAD%' or PartNo LIKE 'WISH%')
group by OrderNo; 
...