Я пытаюсь построить инструкцию 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 | ----------------------------------
Было бы здорово, если бы вы помогли мне с этой проблемой. Большое спасибо!
Предполагая, что строки представляют 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;