我过去常常把这个问题发布到SO,但我给出的答案显示了来自tbl_product的所有表格,而不是来自tbl_inventory和tbl_reserve。你能帮忙吗?非常感谢你。
tbl_inventory
inv_id | pd_id | inv_qty_act | inv_date | inv_note
1 | 001 | 120 | 20-Sep-12|
2 | 003 | 387 | 1-Oct-12 |
tbl_reserve
res_id | cust_id | res_date | res_duedate | pd_id | res_qty | if_sent | res_note
3 | 10 | 01-Oct-12| 17-Oct-12 | 001 | 135 | |
4 | 9 | 01-Oct-12| 24-Oct-12 | 001 | 253 | |
5 | 22 | 01-Oct-12| 17-Oct-12 | 001 | 132 | |
6 | 2 | 01-Oct-12| 24-Oct-12 | 002 | 446 | |
tbl_product
pd_id | pd_name
001 | des1
002 | des2
003 | des3
tbl_pdtn_startup
pdtn_st_id | pd_id | pdtn_qty_est
2 | 002 | 200
3 | 003 | 100
我想要的输出:
为了让我更容易,我真正想要的是报告显示:
1.产品名称(pd_name)
2.成品数量(inv_qty_act)
3.生产中的估计数量(pdtn_qty_est)
4.和客户保留的产品总和(Sum(res_qty)。
至于总字段,我可以从代码中计算出来。非常感谢你
pd_id| pd_name| inv_qty_act|pdtn_qty_est| Sum(res_qty)| Total[(inv_qty_est) - Sum(res_qty)]
001 | des1 | 120 | 0 | 520 | -400 -->(120-520)
002 | des2 | 0 | 200 | 446 | -446 -->(0-446)
003 | des3 | 387 | 100 | 0 | 387
我真正想要的结果是只有“红色”矩形的记录
答案 0 :(得分:1)
要在Access SQL中连接两个以上的表,必须将每个JOIN
放在括号中:
SELECT
tbl_product.pd_id,
tbl_product.pd_name,
tbl_inventory.inv_qty_act,
tbl_pdtn_startup.pdtn_qty_est,
Sum(tbl_reserve.res_qty) AS [Sum(res_qty)]
FROM
((tbl_product
LEFT JOIN tbl_inventory ON tbl_product.pd_id = tbl_inventory.pd_id)
LEFT JOIN tbl_pdtn_startup ON tbl_product.pd_id = tbl_pdtn_startup.pd_id)
LEFT JOIN tbl_reserve ON tbl_product.pd_id = tbl_reserve.pd_id
GROUP BY
tbl_product.pd_id,
tbl_product.pd_name,
tbl_inventory.inv_qty_act,
tbl_pdtn_startup.pdtn_qty_est;
如果您不确定Access中的正确语法,只需在查询设计器中构建查询,然后切换到SQL View。查询设计器将自动添加括号。
还有一件事:
在您想要的输出中,inv_qty_act
,pdtn_qty_est
和Sum(res_qty)
列中的缺失值为零。在vanilla LEFT JOIN
查询中,这些将是NULL
。
所以我的上面的查询实际上返回了这个:
pd_id| pd_name| inv_qty_act|pdtn_qty_est| Sum(res_qty)| ...
001 | des1 | 120 | NULL | 520 | ...
002 | des2 | NULL | 200 | 446 | ...
003 | des3 | 387 | 100 | NULL | ...
^ ^ ^
| | |
|___ NULL instead of 0 __|
如果您想获得0
而不是NULL
,则必须使用Nz()
函数将NULL
值转换为零。
而不是SELECT column
,只需使用SELECT Nz(column, 0)
。
所以最终的查询看起来像这样:
SELECT
tbl_product.pd_id,
tbl_product.pd_name,
nz([inv_qty_act],0),
nz([pdtn_qty_est],0),
Sum(nz([res_qty],0)) AS [Sum(res_qty)]
FROM
((tbl_product
LEFT JOIN tbl_inventory ON tbl_product.pd_id = tbl_inventory.pd_id)
LEFT JOIN tbl_pdtn_startup ON tbl_product.pd_id = tbl_pdtn_startup.pd_id)
LEFT JOIN tbl_reserve ON tbl_product.pd_id = tbl_reserve.pd_id
GROUP BY
tbl_product.pd_id,
tbl_product.pd_name,
tbl_inventory.inv_qty_act,
tbl_pdtn_startup.pdtn_qty_est;
修改强>
好的,试试这个:
SELECT
tbl_product.pd_id,
tbl_product.pd_name,
nz([inv_qty_act],0),
nz([pdtn_qty_est],0),
Sum(nz([res_qty],0)) AS [Sum(res_qty)]
FROM
((tbl_product
LEFT JOIN tbl_inventory ON tbl_product.pd_id = tbl_inventory.pd_id)
LEFT JOIN tbl_pdtn_startup ON tbl_product.pd_id = tbl_pdtn_startup.pd_id)
LEFT JOIN tbl_reserve ON tbl_product.pd_id = tbl_reserve.pd_id
GROUP BY
tbl_product.pd_id,
tbl_product.pd_name,
tbl_inventory.inv_qty_act,
tbl_pdtn_startup.pdtn_qty_est
HAVING
tbl_inventory.inv_qty_act IS NOT NULL
or tbl_pdtn_startup.pdtn_qty_est IS NOT NULL
查询与上面相同,只有最后三行(HAVING
子句)是新的
所有不在tbl_inventory
或tbl_pdtn_startup
的产品都会被忽略
这是你想要的吗?
答案 1 :(得分:0)
使用“左连接”显示产品,即使其他表没有此类产品