如何在不重复的情况下连接计算出的一系列变量

时间:2017-07-03 16:41:21

标签: mysql sql

我有一组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

2 个答案:

答案 0 :(得分:1)

更优雅的解决方案可能是将您的品牌和轮胎位置重新设计为“品牌”表,作为单独的列。然后,您可以使用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)

答案 1 :(得分:0)

我想通了,部分归功于@ 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。匹配的原始表连接起来。