【问题标题】:Query SQL Select Column Matching From Another Table查询 SQL 从另一个表中选择列匹配
【发布时间】:2022-11-28 18:16:47
【问题描述】:

我有两个包含 tbl_goods 和 tbl_units 的表,如下所示:

tbl_goods

   +--------+-------+-------+-------+  
   | goods  |code   |qty    |unit   |  
   +--------+-------+-------+-------+   
   | cigar  | G001  | 1     | pack  |
   | cigar  | G001  | 2     | pcs   |
   | bread  | G002  | 2     | pcs   |   
   | soap   | G003  | 1     | pcs   |  
   +--------+-------+-------+-------+

和 tbl_units 如下:

   +--------+-------------+-------+  
   | code   |conversion   |qty    |
   +--------+-------------+-------+
   | G001   | pack        | 10    |
   +--------+-------------+-------+

所以只有雪茄会有转换,因为表格单位有代码

我需要显示的结果如下:

   +--------+-------+-------+-------+--------+  
   | goods  |code   |qty    |unit   | total  |
   +--------+-------+-------+-------+--------+   
   | cigar  | G001  | 1     | pack  | 10     |
   | cigar  | G001  | 2     | pcs   | 2      |
   | bread  | G002  | 2     | pcs   | 2      |
   | soap   | G003  | 1     | pcs   | 1      |
   +--------+-------+-------+-------+--------+

因此,如果商品中的代码在 tbl_units 中不匹配,那么它将在 tbl_goods 中显示为 qty,但如果它们匹配,则它将从 tbl_units 转换为乘法

非常感谢..真的很感激

问候

【问题讨论】:

    标签: mysql sql vb.net sqlite dbeaver


    【解决方案1】:
    SELECT
        tbl_goods.goods
    ,   tbl_goods.code
    ,   tbl_goods.qty
    ,   tbl_goods.unit
    ,   IF(tbl_goods.unit=tbl_units.conversion,tbl_goods.qty*tbl_units.qty,tbl_goods.qty) total 
    FROM tbl_goods
    LEFT JOIN tbl_units ON tbl_goods.code=tbl_units.code
    

    在total列,我们可以匹配tbl_goods中的单位是否与tbl_units相同,即pack。

    如果相同,则我们将 tbl_units 中的包装数量乘以 tbl_goods 中的包装数量,否则,只返回 tbl_goods 中的数量。

    【讨论】:

      【解决方案2】:

      如果我理解正确,您正在寻找 LEFT JOIN 和 CASE WHEN 或 COALESCE 的组合。

      这里是 CASE WHEN 选项:

      SELECT g.goods, g.code, g.qty, g.unit, 
      CASE WHEN u.conversion IS NULL 
        THEN g.qty
        ELSE g.qty * u.qty
        END AS total
      FROM 
      tbl_goods g
      LEFT JOIN tbl_units u
      ON g.code = u.code
      AND g.unit = u.conversion;
      

      如前所述,COALESCE 也可以,而且更短一些:

      SELECT g.goods, g.code, g.qty, g.unit, 
      g.qty * COALESCE(u.qty,1) AS total
      FROM 
      tbl_goods g
      LEFT JOIN tbl_units u
      ON g.code = u.code
      AND g.unit = u.conversion;
      

      但我认为与CASE WHEN相比,这个选项的可读性更差。

      因此,我在这里更喜欢CASE WHEN。

      试用:db<>fiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-15
        • 2013-12-14
        • 1970-01-01
        • 2020-03-04
        • 1970-01-01
        • 2012-12-01
        • 2018-07-27
        相关资源
        最近更新 更多