0

我曾经将这个问题发布给 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

期望的结果

我真正想要的结果是仅在“红色”矩形中的记录

4

2 回答 2

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 视图。查询设计器将自动添加括号。

还有一件事:
在您想要的输出中inv_qty_actpdtn_qty_estSum(res_qty)列中的缺失值为零。在普通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被忽略的产品。
这是你想要的吗?

于 2012-10-04T21:39:09.043 回答
0

即使另一个表没有这样的产品,也可以使用左连接来显示产品

于 2012-10-04T05:15:58.633 回答