【问题标题】:MYSQL INNER JOIN values from different tables in one row一行中不同表的 MYSQL INNER JOIN 值
【发布时间】:2021-08-18 11:45:23
【问题描述】:

我有两张桌子。

加载计划

LoadNumber LoadDate Driver
15627 2021-08-10 David

GpsTable

LoadNumber LineNo AddressCode AddType
15627 1 A001 C
15627 2 A002 D

我希望一个表中的 LoadNumber 和 LoadDate 与另一表中的 AddressCode 作为 SourceCode 或 DestinationCode 连接(取决于 AddType 是 C 还是 D)。所以最终的结果是:

LoadNumber LoadDate SourceCode DestinationCode
15627 2021-08-10 A001 A002

我尝试过的如下:

select
DISTINCT ls.LoadNumber,
ls.LoadDate,
CASE WHEN gps.AddType = 'C' THEN gps.AddressCode END AS 'SourceGPSCode',
CASE WHEN gps.AddType = 'D' THEN gps.AddressCode END AS 'DestinationGPSCode'
FROM LoadSchedule AS ls INNER JOIN GpsTable as gps ON gps.LoadNumber = ls.LoadNumber
WHERE ls.LoadDate >= '2021-08-10'

结果如下

LoadNumber LoadDate SourceCode DestinationCode
15627 2021-08-10 A001
15627 2021-08-10 A002

然后我尝试使用 GROUP BY 函数将其放在一行中:

select
DISTINCT ls.LoadNumber,
ls.LoadDate,
CASE WHEN gps.AddType = 'C' THEN gps.AddressCode END AS 'SourceGPSCode',
CASE WHEN gps.AddType = 'D' THEN gps.AddressCode END AS 'DestinationGPSCode'
FROM LoadSchedule AS ls INNER JOIN GpsTable as gps ON gps.LoadNumber = ls.LoadNumber
WHERE ls.LoadDate >= '2021-08-10' GROUP BY ls.LoadNumber

但结果显示 DestinationCode 为 (Null)

LoadNumber LoadDate SourceCode DestinationCode
15627 2020-08-10 A001 (Null)

你能帮我得到如下一行的最终结果吗?

LoadNumber LoadDate SourceCode DestinationCode
15627 2021-08-10 A001 A002

【问题讨论】:

    标签: mysql case inner-join


    【解决方案1】:

    你需要条件聚合:

    SELECT ls.LoadNumber, ls.LoadDate,
           MAX(CASE WHEN gps.AddType = 'C' THEN gps.AddressCode END) AS SourceGPSCode,
           MAX(CASE WHEN gps.AddType = 'D' THEN gps.AddressCode END) AS DestinationGPSCode
    FROM LoadSchedule AS ls INNER JOIN GpsTable AS gps 
    ON gps.LoadNumber = ls.LoadNumber
    WHERE ls.LoadDate >= '2021-08-10'
    GROUP BY ls.LoadNumber, ls.LoadDate;
    

    【讨论】:

      【解决方案2】:

      你也可以通过应用多个左连接来做到这一点

      select distinct
            ls.LoadNumber,
            ls.LoadDate,
            src.AddressCode SourceGPSCode,
            dst.AddressCode DestinationGPSCode
         FROM 
            LoadSchedule ls 
               LEFT JOIN GpsTable src
                  ON ls.LoadNumber = gps.LoadNumber
                  AND src.AddType = 'C'
               LEFT JOIN GpsTable dst
                  ON ls.LoadNumber = dst.LoadNumber
                  AND dst.AddType = 'D'
         WHERE 
            ls.LoadDate >= '2021-08-10'
      

      现在,如果您有一个包含多个源代码和/或分销代码的单个负载,这将创建多个行来表示。但是您的上下文不清楚这种影响。考虑 GPS 表,如果您正在处理卡车运输,例如,您可能有一个负载有多个取货地点,但也有多个下车地点。在这种情况下该怎么办。在任何一种情况下,您都不能只依赖第一个、最大或最后一个条目。但只有您可以说出这些注意事项并提供反馈。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-25
        • 1970-01-01
        • 2018-11-17
        • 2014-12-23
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 2016-10-14
        相关资源
        最近更新 更多