1

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

それらは次のように見えます。

請求書

id    |    paymentType     |     grossTotal   |    dateTime
1     |         Cash       |        1000      |   UNIX TIME    
2     |         Card       |        1350      |   UNIX TIME   
3     |         Card       |        1250      |   UNIX TIME   
4     |         Card       |        750       |   UNIX TIME 

預金

id    |    paymentType     |       invNo      |    dateTime    |     amount
1     |         Cash       |         1        |    UNIX TIME   |       150
2     |         Card       |         2        |    UNIX TIME   |       350

デポジットは常に過去の日付であり、請求書の日付はたとえば ですtoday。そのため、請求書で今日支払われた残高を確認したいと考えていinvoices.grossTotal - deposits.amountます。

したがって、上記の表の例では、請求書 1 に 850 ポンド、請求書 2 に 1000 ポンドが支払われます。これは、それぞれの 1 行または 2 行で簡単に達成できますが、支払いタイプと預金請求書をグループ化すると行き詰まります。 ...

SELECT 
   invoices.id, 
   sum(grossTotal)-IFNULL(depositsCheck.previouslyPaid,0) as todayTotal, 
   depositsCheck.previouslyPaid, sum(grossTotal) as grossTotal  
FROM `invoices`    
    LEFT JOIN (SELECT SUM(amount) as previouslyPaid, invNo 
    FROM deposits 
    GROUP BY invNo) depositsCheck ON depositsCheck.invNo=invoices.id 
GROUP BY  invoices.paymentType ORDER BY id DESC

上記の SQL クエリは、現金で支払われた商品には機能しますが、カードの支払いには機能しません。これは、グループ化はテーブルの列が正しくないことinvoices.paymentTypeを意味するため、この行にデポジットが関連しないがある場合、 は失敗するためです。 .idinvoicesJOINid

上記のようにクエリを実行するにはどうすればよいですか?ただし、グループ化された列 ID レコードと一致する支払いタイプでグループ化された、請求書の任意のインスタンスのテーブルjoinを確実に実行できますか?deposits

mySqlを使っているので、MySqlでできるjoinを投稿してください!:D

4

1 に答える 1

0

問題は、 を使用すると、グループ化した列と集計GROUP BYしかできないことです。SELECT

invoices.idは、選択しようとしたがグループ化されていない列です。GROUP BYおそらく、この列を句に追加する必要があると思います。

SELECT 
   invoices.id, 
   sum(grossTotal)-IFNULL(depositsCheck.previouslyPaid,0) as todayTotal, 
   depositsCheck.previouslyPaid, sum(grossTotal) as grossTotal  
FROM `invoices`    
    LEFT JOIN (SELECT SUM(amount) as previouslyPaid, invNo 
    FROM deposits 
    GROUP BY invNo) depositsCheck ON depositsCheck.invNo=invoices.id 
GROUP BY  invoices.paymentType, invoices.id ORDER BY id DESC

あなたが与えたテーブルの例では、おそらく次のようになります。

id    |    paymentType     |     grossTotal   |    dateTime   |   previouslyPaid
1     |         Cash       |        1000      |   UNIX TIME   |       150
2     |         Card       |        1350      |   UNIX TIME   |       350
3     |         Card       |        1250      |   UNIX TIME   |         0
4     |         Card       |        750       |   UNIX TIME   |         0

しかし、一般的には、次のようなものになります。

id    |    paymentType     |     grossTotal   |    dateTime   |   previouslyPaid
1     |         Cash       |        1000      |   UNIX TIME   |       150
1     |         Card       |        1000      |   UNIX TIME   |       300
2     |         Cash       |        1350      |   UNIX TIME   |       350
2     |         Card       |        1350      |   UNIX TIME   |       350

上記の請求書 1 では、150 が現金で支払われ、300 がカードで支払われました。

于 2012-09-07T10:48:59.007 に答える