mysql - MySQL 中具有 bool 值的行到列

标签 mysql sql database relational-database

我正在尝试构建一个 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/

相关文章:

mysql - 使Linux上的MYSQL可以被远程访问

mysql - 设计一个数据库来处理产品变化的库存跟踪

mysql - 字符集 utf8 给出语法错误

mysql - 无法创建表,不确定要做什么(错误 : 150)

java - 如何从计算行数的 SQL 查询开始正确实现 Hibernate SQL 查询?

mysql - SUM(COUNT(列)*AVG(列)) AS 列

mysql - PHP MySQL 库版本与您的 MySQL 服务器版本不同

php - 在动态单选按钮循环中获取提交的值和名称时遇到问题

php - 为什么 JSON 返回 null?

java - 从 ResultSet 读取空值