0

私はこの質問をSOに投稿していましたが、与えられた答えには、tbl_inventoryとtbl_reserveからではなく、tbl_productからのすべてのテーブルが表示されました。助けてください。どうもありがとうございました。

    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

必要な出力:
簡単にするために、私が本当に必要としているのは、以下を 示す レポート です
:顧客から予約されている製品 (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で3つ以上のテーブルを結合するには、それぞれ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ビューに切り替えてください。クエリデザイナは括弧を自動的に追加します。

もう1つ:
目的の出力では、、および列の欠落値inv_qty_actpdtn_qty_estゼロSum(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 columnSELECT 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

クエリは上記と同じですが、最後の3行(HAVING句)のみが新しいです。含まれていない、または無視され
ているすべての製品。 これはあなたが望んでいたことですか?tbl_inventorytbl_pdtn_startup

于 2012-10-04T21:39:09.043 に答える
0

他のテーブルにそのような製品がない場合でも、左結合を使用して製品を表示します

于 2012-10-04T05:15:58.633 に答える