我有一组 6 个变量用于观察卡车轮胎品牌。轮胎之间的品牌可能不同,但通常都是一样的。 我需要创建一个汇总变量,为每个观察列出轮胎的所有品牌。
一个简单的SELECT CONCAT(BrandP1, ', ', BrandP2...) AS Brand
通常会有很多重复。
我想只有在 N-1 变量不同时才连接 N 变量,但我认为这样做很丑陋。有没有一种优雅的方法将 6 个变量的内容汇总为一个新的计算变量?
根据要求,表格摘录:
ID_vehicle, BrandP1, BrandP2, BrandP3, BrandP4
----------------------------------------------
1 Dunlop Dunlop Riken Riken
2 Dunlop Dunlop Dunlop Dunlop
3 Riken Dunlop Toyo Toyo
我想得到的是
ID_vehicle, Brand
------------------
1 Dunlop, Riken
2 Dunlop
3 Riken, Dunlop, Toyo
我能得到CONCAT
1 Dunlop, Dunlop, Riken, Riken
2 Dunlop, Dunlop, Dunlop, Dunlop
3 Riken, Dunlop, Toyo, Toyo
更优雅的解决方案可能是重新设计"品牌"表,将您的品牌和轮胎位置作为单独的列。 然后,您可以使用DISTINCT
GROUP_CONCAT
列出在每次观察期间发现/使用的品牌。 像这样:
SELECT ALL
`observation_id`,
GROUP_CONCAT( DISTINCT `tire_brand` SEPARATOR ', ')
FROM
`truck_observations`
GROUP BY
`observation_id`
这样观察类似于:
ID, Position, Brand
----------------------
1, 1, Dunlop
1, 2, Dunlop
1, 3, Dunlop
1, 4, Toyo
1, 5, Riken
1, 6, Riken
2, 1, Riken
2, 2, Dunlop
2, 3, Dunlop
2, 4, Riken
2, 5, Dunlop
2, 6, Riken
可以概括为:
ID, Brands
----------------------
1, (Dunlop, Toyo, Riken)
2, (Riken, Dunlop)
我想通了,部分归功于@a3r0,尽管我无法创建新表或更改数据库架构。
所以我去了
SELECT ALL
ID,
GROUP_CONCAT( DISTINCT Brand SEPARATOR ', ') AS BrandP
FROM (
SELECT ID, Wheel, Brand FROM (
SELECT ID, 'BrandP1' Wheel, BrandP1 Brand FROM Pneumatici
UNION ALL
SELECT ID, 'BrandP2', BrandP2 FROM Cars
UNION ALL
SELECT ID, 'BrandP3', BrandP3 FROM Cars
UNION ALL
SELECT ID, 'BrandP4', BrandP4 FROM Cars
UNION ALL
SELECT ID, 'BrandP5', BrandP5 FROM Cars
UNION ALL
SELECT ID, 'BrandP6', BrandP6 FROM Cars
) AS y
WHERE Brand != ''
) AS x
GROUP BY ID
转置我感兴趣的变量 然后将其与 id 匹配的原始表连接起来。