2

私は問題があります。私は4つのテーブルを持っています:

Invoice_Payment、請求書、クライアント、およびカレンダー

基本的に、私は以下のクエリを持っていますが、これはうまく機能しますが、date_due のない月は返されません。IE では、date_due のある月のみが返されます。

注: カレンダーの表は、1 年の毎日を単純にリストしたものです。単一の col 呼び出し date_field が含まれています

データベース: http://oberto.co.nz/jInvoice.txt

期待される出力: 以下の現在のクエリは、次のようなものを返します。

month       total
August      5
September   0
October  196
November  205
December  214
January  229

9 月が返されないことに注意してください。これは、テーブル Invoice_Payment に date_due レコードがないためです

左結合を使用して、カレンダー テーブルを次のように結合する必要があると思います。LEFT JOIN Calendar ON Invoice_Payments.date_paid = Calendar.date_field でも運がない

SELECT MONTHNAME(Invoice_Payments.date_paid) as month, SUM(Invoice_Payments.paid_amount) AS total
FROM Invoice, Client, Invoice_Payments
WHERE Client.registered_id = 1
AND Client.id = Invoice.client_id
And Invoice.id = Invoice_Payments.invoice_id
AND date_paid IS NOT NULL
GROUP BY YEAR(Invoice_Payments.date_paid), MONTH(Invoice_Payments.date_paid)

どんな助けでも感謝します。

4

3 に答える 3

5

値があるかどうかに関係なく、範囲内のすべての日付の値を見つけようとしているようです。次のような構造の Calendar テーブルがあるとします。

Create Table Calendar
(
    [Date] not null Primary Key
)

クエリは次のようになります (X と Y は、調査対象の範囲の開始日と終了日を表します)。

Select Year(C.Date), MonthName(C.Date) As Month
    , Coalesce(Sum(IP.paid_amount),0) As Total
From Calendar As C
    Left Join (Invoice As I
        Join Client As C1
            On C1.id = I.client_id
                And C.registered_id = 1
        Join Invoice_Payments As IP
            On IP.Invoice_id = I.Id)
        On IP.date_paid = C.date
Where C.Date Between X and Y
Group By Year(C.Date), MonthName(C.Date)

技術的には、上記のクエリでうまくいくはずです。ただし、別の方法として、コメントで問い合わせた派生テーブルを使用することもできます。

Select Year(C.Date), MonthName(C.Date) As Month
    , Coalesce(Sum(Z.paid_amount),0) As Total
From Calendar As C
    Left Join   (
                Select IP.date_paid, IP.paid_amount
                From Invoice As I
                        Join Client As C1
                            On C1.id = I.client_id
                                And C.registered_id = 1
                        Join Invoice_Payments As IP
                            On IP.Invoice_id = I.Id
                ) As Z
        On Z.date_paid = C.date
Where C.Date Between X and Y
Group By Year(C.Date), MonthName(C.Date)
于 2011-01-16T06:54:01.177 に答える
1

同様の問題が発生し、カレンダーテーブル以外の条件をWHERE句から結合に移動することで解決しました。ここで私の完全な説明を参照してください:https ://gist.github.com/1137089

あなたの場合、テーブル1、テーブル2、テーブル3からx=yなどの左結合テーブル1に因数分解する必要があります...

于 2011-08-11T01:15:26.617 に答える
0

読みやすくするために、すべての結合を明示的に定義します。

最初のテーブルのすべての行を保持し、2 番目のテーブルの欠落している列を NULL で埋める外部結合の簡単な例:

select column1,
from table1
left outer join table2
  on table1.key = table2.key

Calendar テーブルがデータを失う原因であると仮定すると、クエリのショットは次のとおりです。

SELECT MONTHNAME(Invoice_Payments.date_paid) as month,
       SUM(Invoice_Payments.paid_amount)
FROM Invoice
JOIN Client
  ON Client.id = Invoice.client_id
 AND Client.registered_id = 1
JOIN Invoice_Payments
  ON Invoice_Payments.invoice_id = Invoice.id
LEFT OUTER JOIN Calendar
  ON Calendar.key = #yourothertable#.key    
WHERE date_paid IS NOT NULL
GROUP BY YEAR(Invoice_Payments.date_paid), MONTH(Invoice_Payments.date_paid)

幸運を!

于 2011-01-16T06:31:30.260 に答える