1

列 (Code、Qtr、Fy、Limit) を持つ 2 つのテーブル L と (Code、Qtr、Fy、Limit) を持つ R があります。Qtr と Fy のコードで左右のテーブル グループの制限の合計を取得したい

次のクエリはエラーなしで実行されますが、間違った出力が得られます。正しい出力を得るために誰かが助けてくれます。テーブルを 1 つだけ使用すると、正常に動作します。問題は結合にあると思います

select L.Code, L. Qtr, L.FY, sum(L.limit),sum(R.Limit) 
from tbl L,tbl R Where
L.Code=R.Code AND
L.Qtr=R.Qtr AND
L.FY=R.FY
group by L.Code,L.Qtr,L.FY

サンプルデータ(テーブルには他の列も含まれていますが、ここでは選択したままにしています)

Tbl L                                        
Code    Qtr,   Fy   Limit                    
001      1      70    200                     
001      1      70    700                     
001       2     70    500    
001       2     70    300

Table R

Code     Qtr    Fy    Limit

001      1       70    1000

001      1       70    200

001      2       70    50

001      2       70    125


Result

Code   Qtr    Fy  Sum(l.Limit)    sum(R.Limit)

001     1     70   900               1200

001     2     70   800               175      

私はMysqlを使用しています

4

2 に答える 2

1

問題は確かに結合です。具体的には、結合条件の結果が一意でない行になる場合、結合GROUP BY 後に a を使用しているため、問題が発生しています。通常、これを解決する方法は、結合の前にグループ化することです。

SELECT L.code, L.qtr, L.fy, L.lim as L_lim, R.lim as R_lim
FROM (SELECT code, qtr, fy, SUM(lim) as lim
      FROM L
      GROUP BY code, qtr, fy) L
JOIN (SELECT code, qtr, fy, SUM(lim) as lim
      FROM R
      GROUP BY code, qtr, fy) R
  ON R.code = L.code
     AND R.qtr = L.qtr
     AND R.fy = L.fy

(動作する SQL Fiddle の例があります)

これは、両方のテーブルにある行の結果のみを表示することに注意してください。また、LIMIT(MySQL およびその他の RDBMS では) は予約語であるため、列名には使用しない方がよいでしょう。

于 2013-10-07T08:34:01.837 に答える
1

このクエリを試してください:

select code, qtr, fy, sum(lsum), sum(rsum)
from (
select L.Code, L.Qtr, L.FY, L.limit as lsum, 0 as rsum
from L
union all
select R.Code, R.Qtr, R.FY, 0 as lsum, R.limit as rsum
from R) as combined
group by code, qtr, fy

この場合に使用joinすると、複数のレコード (L と R の一致ごとに 1 つ) が作成され、 asumを実行すると誤った結果が得られるため、間違った考えになります。

于 2013-10-07T07:29:59.210 に答える