我正在尝试构建一个 SQL 语句(针对 MySQL)来解决以下问题:
我有一个表transport_table,其中包含从哪个位置到哪个其他位置的交通信息。该表按transport_from(升序)排序,然后按transport_to(升序)排序。可能有些地点只接收 cargo ,其他地点只发送 cargo ,但大多数地点都发送和接收 cargo 。也可以将 cargo 发送到自己的位置。
--------------------------------- | 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 实现,那就太好了(如果不可能,我仍然可以使用真正的编程语言)。如果两个位置之间有交通工具,您能帮助我如何找到一个用 bool 值指示的表吗?为了实现这一点,我需要将行转移到列,并在原始表中存在特定行时设置 bool 值。但我不知道如何实现这一目标。 这样的表应该如下所示:
---------------------------------- | 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,以填充 TRANSPORT_FROM
缺少的 ID(2 和 6)。您还可以通过创建一个包含所有 TRANSPORT_FROM
ID 的虚拟表并使用该表代替由别名 A
表示的内部查询来实现此目的。
编辑使其动态。
我不确定这是否有效,但我尝试过一个至少应该给出方向的版本。
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;
关于mysql - MySQL 中具有 bool 值的行到列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47732606/