12

私は2つのテーブルを持っています:

いくつかのフィールドと主キーIDを持つディーラー

および次のフィールドでの問い合わせiddealer_idcosts

ディーラーごとにお問い合わせの項目がいくつかありますので、数えて費用を合計する必要があります。今、私はこのステートメントでカウントだけを持っています:

SELECT a.*, Count(b.id) as counttotal
FROM dealers a
LEFT JOIN inquiries b on a.id=b.dealer_id
GROUP BY a.id
ORDER BY name ASC

しかし、各ディーラーの表bのコストを合計する方法がわかりません。誰か助けてもらえますか?前もって感謝します

4

6 に答える 6

20

次の 2 つのサブクエリを使用できます。

SELECT  a.*
      , (SELECT Count(b.id) FROM inquiries I1 WHERE I1.dealer_id = a.id) as counttotal
      , (SELECT SUM(b.cost) FROM inquiries I2 WHERE I2.dealer_id = a.id) as turnover
FROM dealers a
ORDER BY name ASC

または

SELECT  a.*
     , COALESCE(T.counttotal, 0) as counttotal   -- use coalesce or equiv. to turn NULLs to 0
     , COALESCE(T.turnover, 0) as turnover       -- use coalesce or equiv. to turn NULLs to 0
 FROM dealers a
 LEFT OUTER JOIN (SELECT a.id, Count(b.id) as counttotal, SUM(b.cost) as turnover
               FROM dealers a1 
               INNER JOIN inquiries b ON a1.id = b.dealer_id
              GROUP BY a.id) T
         ON a.id = T.id
ORDER BY a.name
于 2013-03-13T14:17:56.107 に答える
4
SELECT a.*, Sum(b.id) as TotalCost
FROM dealers a
LEFT JOIN inquiries b on a.id=b.dealer_id
GROUP BY a.id
ORDER BY name ASC
于 2013-03-13T14:24:26.440 に答える
2

私があなたの質問を理解していれば、あなたがする必要があるのは次を追加することだけですSUM():

SELECT a.*, 
  Count(b.id) as counttotal,
  sum(b.costs) TotalCost
FROM dealers a
LEFT JOIN inquiries b on a.id=b.dealer_id
GROUP BY a.id
ORDER BY name ASC

私の提案は、サブクエリを使用してcountとを取得することsumです。

SELECT a.*, 
  b.countTotal,
  b.TotalCosts
FROM dealers a
LEFT JOIN
(
    select COUNT(ID) countTotal,
        SUM(costs) TotalCosts,
        dealer_id
    from inquiries
    group by dealer_id
) b 
    on a.id=b.dealer_id
ORDER BY name ASC

元のクエリから、MySQL を使用していると推測しています。サブクエリを使用することをお勧めします。MySQL は GROUP BY の拡張機能を使用して、選択リスト内の項目を集約せず、GROUP BY句に含めないようにするためです。ただし、MySQL は返される値を選択できるため、予期しない結果が生じる可能性があります。( GROUP BY に対する MySQL 拡張機能を参照してください)

MySQL ドキュメントから:

MySQL は GROUP BY の使用を拡張して、選択リストが GROUP BY 句で指定されていない非集計列を参照できるようにします。... この機能を使用して、不要な列の並べ替えやグループ化を回避することで、パフォーマンスを向上させることができます。ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じである場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、各グループからの値の選択は、ORDER BY 句を追加しても影響を受けません。結果セットのソートは値が選択された後に行われ、ORDER BY はサーバーが選択する値には影響しません。

于 2013-03-13T14:18:30.620 に答える
0

必要なフィールドを含むサブテーブルを作成し、それを結合すると、完全なテーブルではなく、作業が簡単になります

a.*、b.count_total、b.costs_of_table
FROM ディーラーを
LEFT JOIN として選択 (

SELECT aux.dealer_id, Count(aux.id) AS 'count_total', Sum(aux.costs) AS 'costs_of_table'
FROM 問い合わせ AS aux
GROUP BY deal_id)

AS b ON a.id = b.dealer_id
WHERE (欲しいもの)
ORDER BY name ASC

バーのスペルがあれば申し訳ありません

于 2013-03-13T14:37:57.733 に答える
0

, Sum(b.costs) as costsTotal選択リストに追加するだけです。

于 2013-03-13T14:18:17.630 に答える