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
2条答案
按热度按时间kqhtkvqz1#
如果我理解正确的话,您要查找的是
LEFT JOIN
和CASE WHEN
或COALESCE
的组合。此处
CASE WHEN
选项:如前所述,
COALESCE
也可以这样做,而且要短一点:但是我认为这个选项的可读性比
CASE WHEN
要差。因此,我更喜欢这里的
CASE WHEN
。试用:db<>fiddle
EDIT,因为作者更改了问题:
根据新的描述,涉及到另一个表,并且表的结构与之前描述的不同。因此,
COALESCE
选项在这种情况下根本不可能。我们在这里需要CASE WHEN
方式:新样胡搞了这一新情况:db<>fiddle
qv7cva1a2#
在total列中,我们可以匹配tbl_goods中的单位是否与tbl_units相同,tbl_units是pack。
如果相同,则将tbl_units中的 Package 数量乘以tbl_goods中的 Package 数量,否则返回tbl_goods的数量。