1

私の問題はやや特殊であるため、非常に長い検索の後、まだ見つけて答えていません。私は次の選択を使用します。

在庫あり:

select 
INs.CatID as CategoryID, 
INs.SubCatID as SubcategoryID, Sum(INs.Quantity) as QuantityIN
from IN_Stock INs
group by INs.CatID, INs.SubCatID
╔════════════╦═══════════════╦════════════╗
║ CategoryID ║ SubcategoryID ║ QuantityIN ║
╠════════════╬═══════════════╬════════════╣
║          2 ║             9 ║ 0          ║
║          1 ║            16 ║ 8          ║
║          1 ║            27 ║ 5          ║
║          1 ║            30 ║ 160        ║
║          1 ║            31 ║ 6          ║
║          1 ║            39 ║ 35         ║
║          1 ║            40 ║ 7          ║
║          2 ║            44 ║ 13         ║
║          2 ║            54 ║ 6          ║
║          2 ║            70 ║ 5          ║
║          3 ║            87 ║ 3,5        ║
╚════════════╩═══════════════╩════════════╝

売り切れ:

select 
OUTs.CatID as CategoryID, 
OUTs.SubCatID as SubcategoryID, 
Sum(OUTs.Quantity) as QuantityOUT
from OUT_Stock OUTs
group by OUTs.CatID, OUTs.SubCatID
╔════════════╦═══════════════╦═════════════╗
║ CategoryID ║ SubcategoryID ║ QuantityOUT ║
╠════════════╬═══════════════╬═════════════╣
║          1 ║            30 ║          30 ║
║          1 ║            39 ║          15 ║
╚════════════╩═══════════════╩═════════════╝

私が得たのは、次の表です(明らかに正しくありません)。

select
INs.CatID as CategoryID, 
INs.SubCatID as SubcategoryID, 
Sum(INs.Quantity) as QuantityIN,
SUM(OUTs.Quantity) as QuantityOUT,
SUM(INs.Quantity)- SUM(OUTs.Quantity) as RemainingQuantity
from IN_Stock INs
left join OUT_Stock OUTs on INs.CatID=OUTs.CatID and INs.SubCatid=OUTs.SubCatid
group by INs.catid, INs.subcatid

╔════════════╦═══════════════╦═════════════╦════════════╦═══════════════════╗
║ CategoryID ║ SubcategoryID ║ QuantityIN  ║ QuantityOUT║ RemainingQuantity ║
╠════════════╬═══════════════╬═════════════╬════════════╬═══════════════════╣
║          2 ║             9 ║ 0           ║            ║                   ║
║          1 ║            16 ║ 8           ║            ║                   ║
║          1 ║            27 ║ 5           ║            ║                   ║
║          1 ║            30 ║ 320         ║        150 ║               170 ║
║          1 ║            31 ║ 6           ║            ║                   ║
║          1 ║            39 ║ 35          ║         30 ║                 5 ║
║          1 ║            40 ║ 7           ║            ║                   ║
║          2 ║            44 ║ 13          ║            ║                   ║
║          2 ║            54 ║ 6           ║            ║                   ║
║          2 ║            70 ║ 5           ║            ║                   ║
║          3 ║            87 ║ 3,5         ║            ║                   ║
╚════════════╩═══════════════╩═════════════╩════════════╩═══════════════════╝

私が望むのは、以下のテーブルのようなものを返す SQL で選択を行うことです...そして、RemaningStock 列で見ることができるかどうか、またどのように見ることができるかを知りたいです: 130 where SubcategoryID=30 and 20 where SubCategoryID=39.

╔════════════╦═══════════════╦════════════╦════════════╦═══════════════════╗
║ CategoryID ║ SubcategoryID ║ QuantityIN ║ QuantityIN ║ RemainingQuantity ║
╠════════════╬═══════════════╬════════════╬════════════╬═══════════════════╣
║          2 ║             9 ║ 0          ║            ║                   ║
║          1 ║            16 ║ 8          ║            ║                   ║
║          1 ║            27 ║ 5          ║            ║                   ║
║          1 ║            30 ║ 160        ║         30 ║               130 ║
║          1 ║            31 ║ 6          ║            ║                   ║
║          1 ║            39 ║ 35         ║         15 ║                20 ║
║          1 ║            40 ║ 7          ║            ║                   ║
║          2 ║            44 ║ 13         ║            ║                   ║
║          2 ║            54 ║ 6          ║            ║                   ║
║          2 ║            70 ║ 5          ║            ║                   ║
║          3 ║            87 ║ 3,5        ║            ║                   ║
╚════════════╩═══════════════╩════════════╩════════════╩═══════════════════╝

両方のテーブルには、特定のカテゴリまたはサブカテゴリの 1 つまたは複数のレコードがあります
。どうもありがとう!
SQL または Access VBA コードのいずれかが適しています。
PS:初めての投稿なので「お手柔らかに」お願いします。

4

2 に答える 2

1

サブクエリを使用して、必要なものを取得できます。次に例を示します。

SELECT *
FROM   (SELECT INs.catid         AS CategoryID,
           INs.subcatid      AS SubcategoryID,
           SUM(INs.quantity) AS QuantityIN
    FROM   in_stock INs
    GROUP  BY INs.catid,
              INs.subcatid) AS a
   LEFT JOIN (SELECT OUTs.catid         AS CategoryID,
                     OUTs.subcatid      AS SubcategoryID,
                     SUM(OUTs.quantity) AS QuantityOUT
              FROM   out_stock OUTs
              GROUP  BY OUTs.catid,
                        OUTs.subcatid) AS b
          ON ( a.subcategoryid = b.subcategoryid )
             AND ( a.categoryid = b.categoryid ); 

このことから、MS Access のクエリ デザイン ウィンドウを使用してクエリを編集および変更するのは非常に簡単です。

SELECT a.categoryid,
   a.subcategoryid,
   a.quantityin,
   b.quantityout,
   [quantityin] - [quantityout] AS RemainingQuantity
FROM   (SELECT INs.catid         AS CategoryID,
           INs.subcatid      AS SubcategoryID,
           SUM(INs.quantity) AS QuantityIN
    FROM   in_stock INs
    GROUP  BY INs.catid,
              INs.subcatid) AS a
   LEFT JOIN (SELECT OUTs.catid         AS CategoryID,
                     OUTs.subcatid      AS SubcategoryID,
                     SUM(OUTs.quantity) AS QuantityOUT
              FROM   out_stock OUTs
              GROUP  BY OUTs.catid,
                        OUTs.subcatid) AS b
          ON ( a.subcategoryid = b.subcategoryid )
             AND ( a.categoryid = b.categoryid ); 
于 2013-02-18T14:13:05.907 に答える
1

主な問題は、最終的なクエリが最初のデータセットの個々の行で結合を行い、それから集計を実行することですが、中間の合計で結合を実行したい場合です。

たとえば、このテスト データを想定すると、次のようになります。

CREATE TABLE table_in (
  id INTEGER,
  value INTEGER
  );

CREATE TABLE table_out (
  id INTEGER,
  value INTEGER
  );

INSERT INTO table_in(id, value) VALUES
  (1, 120),
  (1, 10);

INSERT INTO table_out(id, value) VALUES
  (1, 30);

LEFT JOIN最後のクエリでの書き方:

SELECT t1.value AS val1, t2.value AS val2
    FROM table_in t1 LEFT JOIN table_out t2 ON t1.id=t2.id;

集計前に次の行が生成されます。

ID     VAL1        VAL2
1      120         30
1      10          30

ここで、合計すると次のようになります。

ID      SUM(VAL1)    SUM(VAL2)
1       130          60

これは、結合に使用される条件に複数の行がある場合に発生します。

すべての入力の合計をすべての出力の合計と比較するため、集計操作のに結合を実行する必要があります。

これは、副選択ステートメントまたはCTEを使用して実行できます。

例えば:

WITH sum_in AS (
  SELECT id, SUM(value) AS all_in
     FROM table_in
  GROUP BY id
), sum_out AS (
  SELECT id, SUM(value) AS all_out
     FROM table_out
  GROUP BY id
)
SELECT t1.id, all_in, all_out, all_in - all_out
    FROM sum_in t1 LEFT JOIN sum_out t2 ON t1.id=t2.id
于 2013-02-18T14:31:43.443 に答える