4

合計機能の使用に問題があります。つまり、基本的に、paiment_typebillsの 2 つのテーブルがあります。billsテーブルには、この特定の請求書に使用された支払いの種類を知ることができる外部キー名fk_paiement_typeがあります。

統計を印刷するとき、支払いタイプごとに合計を取得するためにこれを行っています:

SELECT 
  pt.name,
  SUM(f.total_ttc) AS total_mode 
FROM
  bills AS f 
  INNER JOIN paiement_type AS pt 
    ON pt.id = f.fk_paiement_type 
WHERE (
    f.created BETWEEN '2013-01-10' 
    AND '2013-01-10'
  ) 
  AND (
    f.type LIKE 'facture' 
    OR f.type LIKE ''
  ) 
GROUP BY f.fk_paiement_type 

このコードはうまく機能しますが、実際には3つの異なる支払いタイプがあり、日中はそのうちの2つしか使用されないこともあり、存在しない場合でも同じように表示したいと考えています。

EDIT:私はすでにIFNULL機能を使用しようとしましたが、うまくいきませんでした。bills テーブルの fk_paiement_type は、paiement_type テーブルに一致する 2 つの値のみを返す場合があります。私の問題はここから来ていると思います:

INNER JOIN paiement_type AS pt ON pt.id = f.fk_paiement_type 

何か案が?

EDIT2:

私のテーブル構造は次のとおりです。

**Bills Table**

id (int), 
fk_paiement_type (int), 
ref (varchar), 
fk_client (int), 
tss (double), 
total_ttc (double), 
type (varchar), 
created (datetime)

**Paiement_type Table**

id (int), 
name (varchar)

私はあなたの最後の答えを試しましたが、それでもうまくいきませんでした。今のところ、Java コードでこの問題を回避するだけですが、それを行うための「クリーンな」方法が欲しいです。

助けてくれてどうもありがとう

4

2 に答える 2

7

ここでは ifnull を使用します

SELECT 
  pt.name,
  IFNULL(SUM(f.total_ttc),0) AS total_mode 
FROM
  factures AS f 
  INNER JOIN paiement_type AS pt 
    ON pt.id = f.fk_paiement_type 
WHERE (
    f.created BETWEEN '2013-01-10' 
    AND '2013-01-10'
  ) 
  AND (
    f.type LIKE 'facture' 
    OR f.type LIKE ''
  ) 
GROUP BY f.fk_paiement_type 

編集 :

SELECT 
  pt.name,
  SUM(f.total_ttc) AS total_mode 
FROM
  bills AS f 
INNER JOIN (SELECT * FROM paiement_type GROUP BY fk_paiement_type) AS pt ON pt.id = f.fk_paiement_type 
WHERE (f.created BETWEEN '2013-01-10' AND '2013-01-10') AND (f.type LIKE 'facture' OR f.type LIKE '') 
GROUP BY f.fk_paiement_type 

内部結合を使用している場合、複数の結果が結合されると思うので、内部結合を制限して、グループごとに 1 つのレコードのみを取得します

于 2013-01-10T07:26:51.340 に答える
0

これを試して

   SELECT 
    f.thename,
     f.total_mode 
    FROM (SELECT name as thename , SUM(total_ttc) AS total_mode  from bills 
          WHERE (
           f.created BETWEEN '2013-01-10' 
           AND '2013-01-10'
          ) 
           AND (
                f.type LIKE 'facture' 
             OR f.type LIKE ''
               ) GROUP BY fk_paiement_type  ) f
    INNER JOIN paiement_type AS pt 
    ON pt.id = f.fk_paiement_type 
于 2013-01-10T08:35:31.007 に答える