0

これが MYSQL で可能であることを願っています。私は PHP でスクリプトを作成しています。

個々の条件とグループ化に基づいて、各月に基づいて値の SUM と COUNT に複数の列を作成しようとしています。テーブルは、accountid を介して既に結合されています。私は月次レポート(テーブル1)とプランター(テーブル2)の2つのテーブルを持っています。

望ましい結果は表1にあります

月次報告書(表1)

REPORTID|ACCOUNTID|COMPMONTH|SUMtoDATE|COUNTtoDATE|SUMcompDATE|COUNTcompDATE|
1     |   190     |    JAN    |   150     |      2      |    150      |       2       | 
2     |   190     |    FEB    |     0     |      0      |    100      |       1       |

プランター(表2)

PlanterID | ACCOUNTID |PLANTER |  SALARY |  compDATE  |    toDATE   |
1         |    190    |   aaa  |   100   | Jan-1-2013 | Jan-05-2013 |
2         |    190    |   bbb  |    50   | Jan-9-2013 | Jan-12-2013 |
3         |    190    |   aaa  |   100   | Feb-1-2013 | Mar-12-2013 |
4         |    190    |   bbb  |     0   | Mar-5-2013 | Mar-12-2013 |

内部結合を使用した単一のクエリは既に機能していますが、両方を実行すると、可能であればロジックを取得できないように見えるため、何も取得できません。

これは私がこれまでスタックオーバーフローから得たものですが、エラーが発生しています。誰かがそれをリファクタリングするか、機能させることができれば幸いです。

SELECT *,
(
SELECT COUNT(planters.todate), SUM(planters.todate)
FROM monthlyreport 
INNER JOIN planters ON monthlyreport.accountid = planters.accountid
WHERE monthlyreport.accountid = 190 AND MONTH(monthlyreport.compmonth) = MONTH(planters.todate)
GROUP BY monthlyreport.mthreportid, month(planters.todate)
) AS count_1,

(
SELECT COUNT(planters.compdate), SUM(planters.compdate)
FROM monthlyreport 
INNER JOIN planters ON monthlyreport.accountid = planters.accountid
WHERE monthlyreport.accountid = 190 AND MONTH(monthlyreport.compmonth) = MONTH(planters.compdate)
GROUP BY monthlyreport.mthreportid, month(planters.compdate)
) AS count_2
4

1 に答える 1

0

あまり明確ではありませんが、私が考える限り、あなたが望むのは、1 つのクエリ結果で 2 つの結果を取得することです。両方のテーブルの accountID に基づいて結合してみてください。AS:

SELECT *
from
(select accountID,COUNT(planters.todate) as count2date, SUM(planters.todate) as sum2date
-----
-----) count_1
inner join
(SELECT accountID,COUNT(planters.compdate) as countcomp, SUM(planters.compdate) as sumcomp
-----
-----) count_2
using(accountID);

count_1 または count_2 の前に「AS」を使用しないでください。外側の選択クエリの * を、count_1.count2date などのより具体的な属性に置き換えることをお勧めします。

お役に立てれば !他に何かお探しのものがあれば、お知らせください。

- - -アップデート - - -

アップロードしたファイルを確認した後、次のクエリを思いつきました。

SELECT count1.compmonth, IFNULL( todatecount, 0 ) , IFNULL( todatesum, 0 ) , IFNULL(      compdatecount, 0 ) , IFNULL( compdatesum, 0 ) 
FROM count_1
LEFT JOIN count_2 ON count_1.compmonth = count_2.compmonth
UNION 
SELECT count2.compmonth, IFNULL( todatecount, 0 ) , IFNULL( todatesum, 0 ) , IFNULL( compdatecount, 0 ) , IFNULL( compdatesum, 0 ) 
FROM count_1
RIGHT JOIN count_2 ON count_1.compmonth = count_2.compmonth

必要に応じて 0 をフォーマットできます。また、データベース プラットフォームが「FULL OUTER JOIN」をサポートしている場合は、左右の結合を結合する代わりにそれを使用できます。

「FROM count_1」を次のように置き換える必要があります。
FROM (select accountID,COUNT(planters.todate) as count2date, SUM(planters.todate) as sum2date ----- -----) count_1

についても同様ですFROM count_2。これは巨大なクエリのように見えますが、共通の日付で 2 つのテーブルを結合するだけで、一致しない他のすべてのフィールドは NULL と指定されます。

于 2013-08-25T01:32:50.937 に答える