Как я могу конвертировать строки в столбцы в SQL? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть такая таблица: Телефоны

  ------------------------------------------------------
   | CustomerID           | PhoneID      | PhoneNum     |
   -----------------------------------------------------
   | 1                    | 101          | 09811111     |
   | 1                    | 102          | 09822222     |
   | 1                    | 103          | 09833333     |
   | 2                    | 104          | 09844444     |
   | 2                    | 105          | 09855555     |
   -------------------------------------------------

Я хочу запрос, который даст мне следующий результат:

--------------------------------------------------------------------------
| CustomerID           | PhoneNum1    |   PhoneNum2    |   PhoneNum3      |
--------------------------------------------------------------------------
| 1                    | 09811111     |   09822222     |   09833333       |
| 2                    | 09844444     |   09855555     |     NULL         |           
---------------------------------------------------------------------------

Как мне построить результат?

Ответы [ 3 ]

3 голосов
/ 11 октября 2019

Мы можем обработать это требование с помощью ROW_NUMBER и сводного запроса:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY PhoneID) rn
    FROM Phones
)

SELECT
    CustomerID,
    MAX(CASE WHEN rn = 1 THEN PhoneNum END) AS PhoneNum1,
    MAX(CASE WHEN rn = 2 THEN PhoneNum END) AS PhoneNum2,
    MAX(CASE WHEN rn = 3 THEN PhoneNum END) AS PhoneNum3
FROM cte
GROUP BY
    CustomerID
ORDER BY
    CustomerID;

Демо

0 голосов
/ 12 октября 2019

I find a way for my asked

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY PhoneID) rn
    FROM Phones
)

SELECT
    CustomerID,
    MAX(CASE WHEN rn = 1 THEN PhoneNum END) AS PhoneNum1,
    MAX(CASE WHEN rn = 2 THEN PhoneNum END) AS PhoneNum2,
    MAX(CASE WHEN rn = 3 THEN PhoneNum END) AS PhoneNum3
FROM cte
where CustomerID = ( select CustomerID from cte where PhoneNum ='09811111' )
GROUP BY
    CustomerID
ORDER BY
    CustomerID;



0 голосов
/ 12 октября 2019

The query above was very useful. But when I use the Where, the result is not right


WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY PhoneID) rn
    FROM Phones
)

SELECT
    CustomerID,
    MAX(CASE WHEN rn = 1 THEN PhoneNum END) AS PhoneNum1,
    MAX(CASE WHEN rn = 2 THEN PhoneNum END) AS PhoneNum2,
    MAX(CASE WHEN rn = 3 THEN PhoneNum END) AS PhoneNum3
FROM cte
where PhoneNum ='09811111'
GROUP BY
    CustomerID
ORDER BY
    CustomerID;

Result:
--------------------------------------------------------------------------
| CustomerID           | PhoneNum1    |   PhoneNum2    |   PhoneNum3      |
--------------------------------------------------------------------------
| 1                    | 09811111     |   NULL         |   NULL           |
---------------------------------------------------------------------------



Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...