Ряды со столбцами в MySQL с логическими значениями

0

Я пытаюсь построить инструкцию SQL (для MySQL), чтобы решить следующую проблему:

У меня есть таблица transport_table с информацией, из которой расположено транспортное средство, в другое место. Эта таблица упорядочивается transport_from (по возрастанию), а затем transport_to (по возрастанию). Возможно, что в некоторых местах только хорошие, другие отправляют товары, большинство мест, однако, отправляют и получают товар. Также можно отправлять товары в нужное место.

---------------------------------
| transport_from | transport_to |
-----------------+---------------
| 1              | 2            |
-----------------+---------------
| 1              | 3            |
-----------------+---------------
| 1              | 7            |
-----------------+---------------
| 3              | 3            |
-----------------+---------------
| 3              | 5            |
-----------------+---------------
| 4              | 5            |
-----------------+---------------
| 4              | 6            |
-----------------+---------------
| 4              | 7            |
-----------------+---------------
| 5              | 3            |
-----------------+---------------
| 7              | 1            |
-----------------+---------------
| 7              | 6            |
---------------------------------

Но мне нужна таблица в другом формате, и было бы здорово, если бы это могло быть достигнуто MySQL (если это невозможно, я все равно мог бы использовать настоящий язык программирования). Можете ли вы мне помочь, как добраться до таблицы с булевыми значениями, если между двумя местоположениями существует транспорт. для этого мне нужно перенести строки в столбцы и установить логические значения, если в исходной таблице существует определенная строка. Но я не знаю, как этого добиться. Такая таблица должна выглядеть так:

----------------------------------
| id | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
-----+---+---+---+---+---+---+----
|  1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |
-----+---+---+---+---+---+---+----
|  2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-----+---+---+---+---+---+---+----
|  3 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
-----+---+---+---+---+---+---+----
|  4 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
-----+---+---+---+---+---+---+----
|  5 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
-----+---+---+---+---+---+---+----
|  6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-----+---+---+---+---+---+---+----
|  7 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
----------------------------------

Было бы здорово, если бы вы помогли мне с этой проблемой. Большое спасибо!

Теги:
database
relational-database

1 ответ

0

Предполагая, что строки представляют TRANSPORT_FROM а столбцы представляют TRANSPORT_TO (поскольку это похоже на то, что вы имели в виду), попробуйте:

SELECT A.TRANSPORT_FROM,
MAX(CASE WHEN TRANSPORT_TO = 1 THEN 1 ELSE 0 END) AS TO_1,
MAX(CASE WHEN TRANSPORT_TO = 2 THEN 1 ELSE 0 END) AS TO_2,
MAX(CASE WHEN TRANSPORT_TO = 3 THEN 1 ELSE 0 END) AS TO_3,
MAX(CASE WHEN TRANSPORT_TO = 4 THEN 1 ELSE 0 END) AS TO_4,
MAX(CASE WHEN TRANSPORT_TO = 5 THEN 1 ELSE 0 END) AS TO_5,
MAX(CASE WHEN TRANSPORT_TO = 6 THEN 1 ELSE 0 END) AS TO_6,
MAX(CASE WHEN TRANSPORT_TO = 7 THEN 1 ELSE 0 END) AS TO_7
FROM
(SELECT DISTINCT TRANSPORT_FROM FROM TRANSPORT_TABLE UNION SELECT DISTINCT TRANSPORT_TO FROM TRANSPORT_TABLE) A
LEFT JOIN
TRANSPORT_TABLE B
ON A.TRANSPORT_FROM = B.TRANSPORT_FROM
GROUP BY A.TRANSPORT_FROM;

Я сделал UNION во внутреннем запросе, чтобы заполнить недостающие ID (2 и 6) для TRANSPORT_FROM. Вы также можете сделать это, создав фиктивную таблицу, содержащую все идентификаторы TRANSPORT_FROM и используя эту таблицу вместо этого внутреннего запроса, представленного псевдонимом A

EDIT Чтобы сделать его динамичным.
Я не уверен, что это сработает, но я попробовал версию, которая должна хотя бы дать направление.

SELECT
GROUP_CONCAT(
    CONCAT(
    ' MAX(CASE WHEN TRANSPORT_TO = ',
    t.TRANSPORT_TO,
    ' THEN 1 ELSE 0 END) AS TO_',
    t.TRANSPORT_TO
    )
) INTO @PivotQuery
FROM
(SELECT TRANSPORT_TO FROM TRANSPORT_TABLE GROUP BY TRANSPORT_TO) t;

SET @PivotQuery = CONCAT('SELECT TRANSPORT_FROM,', @PivotQuery, ' FROM TRANSPORT_TABLE GROUP BY TRANSPORT_FROM ORDER BY TRANSPORT_FROM');


PREPARE statement FROM @PivotQuery;
EXECUTE statement;
DEALLOCATE PREPARE statement;
  • 0
    Спасибо за быстрый ответ! Ваше предположение верно. Но есть одна серьезная проблема: есть 500 местоположений, и я не хотел бы жестко их кодировать, но позволить динамически адаптировать запрос (новые местоположения могут добавляться каждый день, но запрос SQL должен оставаться прежним). У тебя тоже есть идея? Это не будет проблемой, если в итоговой таблице отсутствуют места, в которые поступают только товары. Важны только места, которые отправляют товары.
  • 0
    Проверьте редактирование. Я пытался сделать его динамичным.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню