sqlite 查询SQL从另一个表中选择匹配的列

xpszyzbs  于 2022-11-30  发布在  SQLite
关注(0)|答案(2)|浏览(243)

edit:对不起,大师们,我必须重新表达我的问题,因为我忘记了在一个查询中有3个表。我有三个表,分别是tbl_goods,tbl_units和tbl_sat,看起来像这样:
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   |ucode        |qty    |
   +--------+-------------+-------+
   | KG001  | U001        | 10    |
   +--------+-------------+-------+

我在tbl_units中代码前面添加了字母“K”,以区别并确保不会与tbl_goods中的代码冲突。
和tbl_sat,如下所示:

+--------+-------------+ 
   | ucode  | unit        |
   +--------+-------------+
   | U001   | pack        |
   +--------+-------------+
   | U002   | box         |
   +--------+-------------+
   | U003   | crate       | etc

因此只有雪茄会有转换,因为表单位有代码
我需要显示的结果如下:

+--------+-------+-------+-------+--------+  
   | 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      |
   +--------+-------+-------+-------+--------+

因此,如果goods中的代码在tbl_units中没有匹配项,则它将在tbl_goods中显示为qty,但如果它们匹配,则它将从tbl_units转换为multiply
非常感谢你的评分
问候
编辑(可能有效?):我试着从@danielpr查询修改,这是结果,我认为它起作用了,请帮忙检查一下

SELECT j.code,j.qty ,j.unit, IIF(j.unit=t.unit,j.qty*u.qty,j.fqty)  FROM tbl_goods j
LEFT JOIN tbl_units u on u.code ='K' || j.code 
LEFT JOIN tbl_sat t ON t.ucode =u.ucode  [WHERE j.code='G001']
GROUP BY j.code,j.qty

[WHERE..]可选如果省略将列出所有项目,但如果我只是想检查雪茄..只需将WHERE CLAUSE

kqhtkvqz

kqhtkvqz1#

如果我理解正确的话,您要查找的是LEFT JOINCASE WHENCOALESCE的组合。
此处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

EDIT,因为作者更改了问题:

根据新的描述,涉及到另一个表,并且表的结构与之前描述的不同。因此,COALESCE选项在这种情况下根本不可能。我们在这里需要CASE WHEN方式:

SELECT g.goods, g.code, g.qty, g.unit, 
CASE WHEN u.qty IS NULL OR u.ucode IS NULL OR t.unit IS NULL
  THEN g.qty
  ELSE g.qty * u.qty
  END AS total
FROM 
tbl_goods g
LEFT JOIN tbl_units u ON u.code = CONCAT('K', g.code)
LEFT JOIN tbl_sat t ON u.ucode = t.ucode AND g.unit = t.unit;

新样胡搞了这一新情况:db<>fiddle

qv7cva1a

qv7cva1a2#

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相同,tbl_units是pack。
如果相同,则将tbl_units中的 Package 数量乘以tbl_goods中的 Package 数量,否则返回tbl_goods的数量。

相关问题