2

このようなテーブルスキーマがあります

mysql> desc material_out;

`ここにコードを入力`
+-------------+--------------+------+-----+------- --+---------+
| | フィールド | フィールド タイプ | ヌル | キー | キー | デフォルト | エクストラ |
+-------------+--------------+------+-----+------- --+---------+
| | ID | int(11) | いいえ | | | 0 | | |
| | バーコード | varchar(20) | いいえ | | | ヌル | | |
| | 名前 | varchar(100) | いいえ | | | ヌル | | |
| | 数量 | ダブル | はい | | | ヌル | | |
| | ユニット | varchar(20) | はい | | | ヌル | | |
| | num_letter | varchar(30) | はい | | | ヌル | | |
| | 日付 | 日付 | はい | | | ヌル | | |
| | 目的地 | varchar(50) | はい | | | ヌル | | |
+-------------+--------------+------+-----+------- --+---------+
8 行セット (0.00 秒)

mysql> desc material_in;

`ここにコードを入力`
+-------------+--------------+------+-----+------- --+---------+
| | フィールド | フィールド タイプ | ヌル | キー | キー | デフォルト | エクストラ |
+-------------+--------------+------+-----+------- --+---------+
| | ID | int(11) | いいえ | | | 0 | | |
| | バーコード | varchar(20) | いいえ | | | ヌル | | |
| | 名前 | varchar(100) | いいえ | | | ヌル | | |
| | 数量 | ダブル | はい | | | ヌル | | |
| | ユニット | varchar(20) | はい | | | ヌル | | |
| | num_letter | varchar(30) | はい | | | ヌル | | |
| | 日付 | 日付 | はい | | | ヌル | | |
| | 目的地 | varchar(50) | はい | | | ヌル | | |
+-------------+--------------+------+-----+------- --+---------+
8 行セット (0.00 秒)

mysql> desc 商品;

`ここにコードを入力`
+-------------+--------------+------+-----+------- --+---------+
| | フィールド | フィールド タイプ | ヌル | キー | キー | デフォルト | エクストラ |
+-------------+--------------+------+-----+------- --+---------+
| | ID | int(11) | いいえ | | | 0 | | |
| | バーコード | varchar(20) | いいえ | | | ヌル | | |
| | 名前 | varchar(100) | いいえ | | | ヌル | | |
| | ユニット | varchar(20) | はい | | | ヌル | | |
| | カテゴリ | varchar(25) | はい | | | ヌル | | |
| | ファーストストック | ダブル) | はい | | | ヌル | | |
+-------------+--------------+------+-----+------- --+---------+
6行セット (0.00秒)

テーブル material_out には、10,000 行のデータがあります。350種類ものバーコードがあります。テーブル material_in には、約 15,000 行のデータがあります。200種類ものバーコードがあります。

しかし、クエリを実行するときに問題があります。おそらく3時間くらいかかります。

レポートを印刷したい場合、これは効率的ではないと思います。

このような私のクエリ。

SELECT br.barcode,
       out.total_out,
       in.total_in,
       out.total_out - in.total_in AS RESULT
FROM
  (SELECT barcode,
          name,
          first_stok,
          unit
   FROM goods
   WHERE category=1) AS br
LEFT JOIN
  (SELECT
     (SELECT sum(qty)
      FROM material_out
      WHERE date >= '2013-08-15'
        AND tanggal <='2013-08-20'
        AND barcode=a.barcode) AS total_out
   FROM material_out a
   GROUP BY a.barcode) AS OUT ON OUT.barcode=br.barcode
LEFT JOIN
  (SELECT
     (SELECT sum(qty)
      FROM material_in
      WHERE date >= '2013-08-15'
        AND tanggal <='2013-08-20'
        AND barcode=a.barcode) AS total_in
   FROM material_in a
   GROUP BY a.barcode) AS IN ON IN.barcode=br.barcode

編集された仲間.. リアリティゴーンからの新しいクエリ。

<pre>
mysql> SELECT tNEW.barcode,
    ->     tNEW.total_out, tNEW.total_in, tNEW.result,
    ->     tOLD.total_out AS total_out_old, tOLD.total_in AS total_in_old, tNEW.total_in +  tOLD.total_in - tNEW.total_out - tOLD.total_out as sum_total
    -> FROM (
    ->     SELECT goods.barcode,
    ->         SUM(tOUT.qty) AS total_out,
    ->         SUM(tIN.qty) AS total_in,
    ->         SUM(tIN.qty) - SUM(tOUT.qty) AS result
    ->     FROM goods
    ->     LEFT JOIN material_out AS tOUT ON tOUT.barcode=goods.barcode
    ->     LEFT JOIN material_in AS tIN ON tIN.kode=goods.barcode
    ->     WHERE goods.category=1
    ->         AND tOUT.date BETWEEN '2013-05-01' AND '2013-08-31'
    ->         AND tIN.date BETWEEN '2013-05-1' AND '2013-08-31'
    ->     GROUP BY goods.barcode
    -> ) AS tNEW
    -> LEFT JOIN (
    ->     SELECT goods.barcode,
    ->         SUM(tOUT.qty) AS total_out,
    ->         SUM(tIN.qty) AS total_in
    ->     FROM goods
    ->     LEFT JOIN material_out AS tOUT ON tOUT.barcode=goods.barcode
    ->     LEFT JOIN material_in AS tIN ON tIN.kode=goods.barcode
    ->     WHERE goods.category=1
    ->         AND tOUT.date BETWEEN '2013-01-01' AND '2013-04-31'
    ->         AND tIN.date BETWEEN '2013-01-01' AND '2013-04-31'
    ->     GROUP BY goods.barcode
    -> ) AS tOLD ON tOLD.barcode=tNEW.barcode;
+-------------+-----------+----------+------------+---------------+-------------------+--------------------+
|   barcode   | total_out | total_in | result     | total_out_old | total_in_old      | sum_total          |
+-------------+-----------+----------+------------+---------------+-------------------+--------------------+
| CG003       |      2720 |    14400 |      11680 |         17588 |             92160 |              86252 |
| CG009       |       144 |      720 |        576 |          NULL |              NULL |               NULL |
| CG010       |       596 |     1800 |       1204 |          1512 |              6048 |               5740 |
| CG011       |       864 |     4320 |       3456 |          1156 |              3600 |               5900 |
| CG012       |      1875 |     7560 |       5685 |           843 |              4680 |               9522 |
| CG013       |      2520 |     7560 |       5040 |          2826 |             14400 |              16614 |
| CG014       |     19320 |   314340 |     295020 |         39312 |            597312 |             853020 |
| CG015       |       890 |     9750 |       8860 |         12003 |            183330 |             180187 |
| CG017       |        24 |   102000 |     101976 |            26 |               420 |             102370 |
| CG018       |    390000 |   273000 |    -117000 |       1320000 |           1020000 |            -417000 |
| CG020       |       396 |     2170 |       1774 |           820 |              3656 |               4610 |
| CG022       |       238 |     1200 |        962 |           330 |               800 |               1432 |
| CG023       |       752 |     3600 |       2848 |          3585 |             21600 |              20863 |
| CG024       |     21560 |   146068 |     124508 |         64095 | 361552.6000000002 |  421965.6000000002 |
| CG025       |     14833 |    85992 |      71159 |         49049 | 230218.0000000009 | 252328.00000000093 |
| CG026       |       172 |     4000 |       3828 |           766 |              1170 |               4232 |
| CG028       |       126 |     1440 |       1314 |            41 |               660 |               1933 |
| CG029       |        18 |      300 |        282 |            40 |               920 |               1162 |
| CG030       |        50 |      720 |        670 |            50 |               780 |               1400 |
| CHDRY001    |     10260 |    81000 |      70740 |         73440 |            936000 |             933300 |
| CHDRY002    |   4071288 |  3477926 |    -593362 |       9762598 |           8570238 |           -1785722 |
| CHDRY003    |      8880 |     4441 |      -4439 |          NULL |              NULL |               NULL |
| CHDRY004    |     48960 |   238590 |     189630 |        119880 |            413850 |             483600 |
| CHDRY005    |       144 |      144 |          0 |           256 |               256 |                  0 |
| CHDRY006    |     37440 |   211200 |     173760 |        164160 |            968000 |             977600 |
| CHDRY007    |    237600 |  1679040 |    1441440 |        604890 |           4758600 |            5595150 |
| CHDRY009    |    766080 |  2026160 |    1260080 |        698250 |           2151560 |            2713390 |
| CHDRY010    |      3600 |   168000 |     164400 |         40800 |           1488000 |            1611600 |
| CHDRY012    |       200 |     2700 |       2500 |           340 |              5600 |               7760 |
| CHDRY013    |      4290 |    17600 |      13310 |          4290 |             21120 |              30140 |
| CHDRY014    |    278300 |   643720 |     365420 |        466210 |           1243620 |            1142830 |
| CHDRY015    |     78720 |   264100 |     185380 |         81840 |            367070 |             470610 |
| CHDRY018    |   2431270 |  1987260 |    -444010 |       4877450 |           4672689 |            -648771 |
| CHDRY022    |      1320 |     4840 |       3520 |           330 |              1650 |               4840 |
| CHDRY023    |       200 |      110 |        -90 |          NULL |              NULL |               NULL |
| CHDRY024    |      2000 |     4000 |       2000 |           100 |               100 |               2000 |
| CHDRY025    |      1800 |     4000 |       2200 |          NULL |              NULL |               NULL |
| CHDRY026    |       850 |      850 |          0 |          NULL |              NULL |               NULL |
| CHDRY028    |       120 |      480 |        360 |          NULL |              NULL |               NULL |
| CHPRINT001  |      8000 |   222000 |     214000 |         13800 |            390000 |             590200 |
| CHPRINT002  |      4000 |    10000 |       6000 |          4200 |             21000 |              22800 |
| CHPRINT004  |     13600 |   324000 |     310400 |         14400 |            512000 |             808000 |
| CHPRINT005  |     28800 |   136800 |     108000 |         35000 |            133000 |             206000 |
| CHPRINT006  |      3100 |    93000 |      89900 |          5600 |            112000 |             196300 |
| CHPRINT007  |     16800 |    69000 |      52200 |          2000 |              9000 |              59200 |
------------------------------------------------------------------------------------------------------------
</pre>

こんにちは、新しい問題があります。フィールドtNEW.total_in + tOLD.total_in - tNEW.total_out - tOLD.total_out. を計算すると、列にnullが含まれている場合、合計の結果にはnullが含まれます。たとえば、バーコード CHDRY025 バーコード CHDRY003 バーコード CHDRY028 バーコード NWDRY004

管理者またはモデレーターの場合、ルールを破って申し訳ありません。:-)

====================== 投稿編集日 2013 年 9 月 30 日 ======================= ===============

こんにちはRealityGone、私はあなたからのクエリを使用しました. 結果はうまくいっています。しかし、新しいデータを入力しようとすると。次に、ディスプレイを再クエリします。しかし、結果は入力されたデータと一致しません。たとえば、あなたからのクエリを入力するとき。以下の結果

+------------------------+-----------+----------+--- ------+---------------+-------------------+
| | バーコード | トータルアウト | total_in | 結果 | total_out_old | total_in_old |
+------------------------+-----------+----------+--- ------+---------------+-------------------+
| | TNWET021 | 6195 | 15000 | 8805 | 20085 | 46200 |
| | TNWET020 | 3420 | 7650 | 4230 | 4860 | 23925 |
| | TNWET019 | 8370 | 25200 | 16830 | 11610 | 47175 |
| | TNWET018 | 18690 | 44100 | 25410 | 13800 | 54150 |
| | TNWET017 | 1140 | 3750 | 2610 | 3690 | 16200 |
| | TNWET016 | 19500 | 56100 | 36600 | 31725 | 111300 |
| | TNWET015 | 5145 | 18150 | 13005 | 6510 | 23400 |
| | TNWET014 | 33300 | 65250 | 31950 | 96300 | 262500 |
| | TNWET013 | 1170 | 5625 | 4455 | 3690 | 13200 |
| | TNWET012 | 720 | 2700 | 1980年 | 3870 | 13800 |
| | TNWET011 | 0 | 0 | 0 | 180 | 450 |
| | TNWET010 | 0 | 0 | 0 | 405 | 1125 |
| | TNWET009 | 0 | 0 | 0 | 0 | 0 |



手動で合計すると、このような結果になります。

mysql> material_in から sum(qty) を選択します。ここで、barcode='TNWET021' および日付は '2013-05-01' と '2013-08-31' の間です。
+-------------+
| | 合計(数量) |
+-------------+
| | 750 |
+-------------+
セットで 1 行 (0.00 秒)


mysql> material_in から sum(qty) を選択します。ここで、barcode='TNWET020' および日付は '2013-05-01' と '2013-08-31' の間です。
+-------------+
| | 合計(数量) |
+-------------+
| | 450 |
+-------------+
セットで 1 行 (0.00 秒)
4

1 に答える 1

1

あなたのクエリは、私がすべきだと思うことさえしているとは思いません。質問で期待する出力を指定しませんでしたが、商品テーブルのバーコードごとに、2 つの材料テーブルの数量フィールドの SUM() が必要だと思います。(また、「tanggal」フィールドは、EXPLAIN 出力になく、英語で日付を意味するため、その上の日付フィールドと同じであると想定しています。)

結合するテーブル式の SELECT ステートメントにサブクエリは必要ありません。また、それらがテーブル式である必要がある理由もまったくわかりません。クエリの実行が信じられないほど遅いことに驚きはありません。結合テーブル式の相関サブクエリです。

サブクエリすら必要ないと思います。これは私の簡略化されたバージョンです:

SELECT goods.barcode,
    SUM(tOUT.qty) AS total_out,
    SUM(tIN.qty) AS total_in,
    SUM(tOUT.qty)-SUM(tIN.qty) AS result
FROM (

商品 LEFT JOIN material_out AS tOUT ON tOUT.barcode=goods.barcode LEFT JOIN material_in AS tIN ON tIN.barcode=goods.barcode WHERE g.category=1 AND tOUT.date BETWEEN '2013-08-15' AND '2013-08 -20' AND tIN.date BETWEEN '2013-08-15' AND '2013-08-20' GROUP BY g.barcode

これを行うためのより良い方法があるかもしれませんが、これはあなたが求めているように2つの日付範囲をすばやくまとめる方法です:

SELECT tNEW.barcode,
    tNEW.total_out, tNEW.total_in,
    tNEW.total_out-tNEW.total_in AS result,
    COALESCE(tOLD.total_out,0) AS total_out_old, COALESCE(tOLD.total_in,0) AS total_in_old
FROM (
    SELECT g.barcode,
        COALESCE(SUM(tOUT.qty),0) AS total_out,
        COALESCE(SUM(tIN.qty),0) AS total_in
    FROM (
        SELECT DISTINCT barcode
        FROM goods
    ) AS g
    LEFT JOIN material_out AS tOUT ON tOUT.barcode=g.barcode
    LEFT JOIN material_in AS tIN ON tIN.barcode=g.barcode
    WHERE g.category=1
        AND tOUT.date BETWEEN '2013-08-15' AND '2013-08-20'
        AND tIN.date BETWEEN '2013-08-15' AND '2013-08-20'
    GROUP BY g.barcode
) AS tNEW
LEFT JOIN (
    SELECT g.barcode,
        SUM(tOUT.qty) AS total_out,
        SUM(tIN.qty) AS total_in
    FROM (
        SELECT DISTINCT barcode
        FROM goods
    ) AS g
    LEFT JOIN material_out AS tOUT ON tOUT.barcode=g.barcode
    LEFT JOIN material_in AS tIN ON tIN.barcode=g.barcode
    WHERE g.category=1
        AND tOUT.date BETWEEN '2013-01-01' AND '2013-04-31'
        AND tIN.date BETWEEN '2013-01-01' AND '2013-04-31'
    GROUP BY g.barcode
) AS tOLD ON tOLD.barcode=tNEW.barcode
于 2013-09-25T05:35:24.220 に答える