1

3つのテーブルから2つの合計を取得したい:

tbl_header
id   id_quotation   description
1    1              descr_1
2    2              descr_2

tbl_body
id   id_quotation   id_item  item_cost
1    1              1        400
2    1              2        300

tbl_money
id   id_quotation   amount
1    1              200
2    1              300
3    2              100

したがって、tbl_head SUM(tbl_body.item_cost) WHERE tbl_body.id_quotation = 1(この場合は400 + 300 = 700)およびSUM(tbl_money.amount) WHERE id_quotation=1(この場合は200 + 300 = 500)から説明を取得するには、1つのクエリが必要です。Id_quotationすべてのテーブルで同じフィールドです。

私はこのクエリでそれを行いました:

select    head.description,
          sum(body.item_cost) as sum_1,
          (select   sum(money.amount)
           from     tbl_money money
           where    money.idquotation=head.idquotation
           GROUP BY money.id_quotation) as sum_2
FROM      tbl_body as body,
          tbl_header as head
WHERE     head.id_quotation=body.id_quotation
GROUP BY  head.description

ここで、内部クエリを削除して次のselect sum(money.amount) from ...ようなものに置き換えたいのですSUM(money.amount)が、常にレコードを3回取得するため、合計は3倍になります。動作しないクエリは次のとおりです。

SELECT        head.description,
              Sum(body.item_cost) AS sum_1,
              sum(money.amount) as sum_2
FROM          (tbl_header head
               INNER JOIN tbl_body body
               ON head.id_quotation=body.id_quotation)
  INNER JOIN  tbl_money money
  ON          head.id_quotation=money.id_quotation
WHERE         head.id_person=1
  AND         money.id_quotation=body.id_quotation
GROUP BY      head.description;

ありがとう。

4

2 に答える 2

0
select min(header.description), SUM(body3.item_cost), SUM(money.amount)
from tbl_header header
    left outer join tbl_body body on header.id_quotation = body.id_quotation
    left outer join tbl_body body1 on body1.id< body.id
    left outer join tbl_body body2 on body2.id> body.id
    left outer join tbl_money money on money.id_quotation = header.id_quotation and body1.id is null
    left outer join tbl_body body3 on body3.id_quotation=header.id_quotation and body2.id is null
where header.id_quotation = 1 
group by header.id_quotation
于 2012-12-20T15:44:26.910 に答える
0

fromサブクエリを句に入れ、適切な結合構文を使用するように結合を修正しますが、あなたのアプローチは問題ありません。やりたいことにはコツがあります。お勧めしませんが、次のことを紹介します。

select    head.description,
          sum(body.item_cost)/count(distinct money.id) as sum_1,
          sum(money) / count(distinct money.id) as sum_2
FROM      tbl_body body join
          tbl_header head
          on head.id_quotation=body.id_quotation join
          tbl_money
          on money.idquotation = head.idquotation
GROUP BY  head.description

つまり、重複のカウントを分割します。これは、最も迅速で最もダーティなクエリに対してのみ実行します。

推奨される方法は、結合の前に money テーブルで集計を行うことです。

select    head.description,
          sum(body.item_cost) as sum_1,
          sum(money) as sum_2
FROM      tbl_body body join
          tbl_header head
          on head.id_quotation=body.id_quotation join
          (select idquotation, SUM(money) as money
           from tbl_money
           group by idquotation
          ) money
          on money.idquotation = head.idquotation
GROUP BY  head.description
于 2012-12-20T16:31:50.680 に答える