0

特定の問題があります。請求書のデータを取得したい。データはグラフに使用されるため、合計が必要です。説明は次のとおりです。

Sub1 は、今月支払われた請求書の金額の合計を取得します。

Sub2 は、今月未払いの請求額の合計を取得します。

Sub3 は、今月支払済みとして計算された請求額の合計を取得しますが、実際には支払われていません。これは、他社が 5 年以上請求書を支払っていない場合に備えて、この請求書は「同様に」支払われたものです (その後、裁判所の手続きが行われます)。

問題は、たとえば sub1 のレコードがない場合、sub2 または sub3 を結合できず、いずれにしてもそれらを表示したい場合です。サブ2にレコードがなく、サブ3にレコードがある場合、サブ3は表示されないため、これも問題です。たとえば、sub1 に NULL 値があり、sub 2 と sub3 に NOT NULL がある場合でも、すべてのレコードを 1 行に表示するにはどうすればよいですか。私は現在、このクエリ ソリューションにほぼ午後中取り組んでいるので、どんな助けも感謝します。:/

SELECT sub1.y,
       sub1.m,
       sub1.val1,
       sub2.val2,
       sub2.y,
       sub2.m,
       sub3.y,
       sub3.m,
       sub3.val3
FROM
  (SELECT YEAR(curdate()) AS y,
          MONTH(curdate()) AS m,
          SUM(totwdisc) AS val1
   FROM pro_partial_inv
   WHERE paidd IS NOT NULL
     AND bringbar=0
     AND YEAR(curdate())=YEAR(paidd)
     AND MONTH(curdate())=MONTH(paidd)
   GROUP BY y,
            m) sub1
INNER JOIN
  (SELECT YEAR(curdate()) AS y,
          MONTH(curdate()) AS m,
          SUM(netto) AS val2
   FROM pro_partial_inv
   WHERE paidd IS NULL
     AND bringbar=0
     AND YEAR(curdate())=YEAR(pdate2)
     AND MONTH(curdate())=MONTH(pdate2)
   GROUP BY y,
            m) sub2
LEFT JOIN
  (SELECT YEAR(curdate()) AS y,
          MONTH(curdate()) AS m,
          SUM(totwdisc) AS val3
   FROM pro_partial_inv
   WHERE paidd IS NOT NULL
     AND bringbar=1
     AND YEAR(curdate())=YEAR(pdate2)
     AND MONTH(curdate())=MONTH(pdate2)
   GROUP BY y,
            m) sub3 
ON sub1.y=sub2.y
AND sub1.m=sub2.m
AND sub2.y=sub3.y
AND sub2.m=sub3.m
4

3 に答える 3

1

年/月を取得するための最初の選択があり、それに対して他の人を参加させたままにしますか?

SELECT sub0.y,
       sub0.m,
       sub1.val1,
       sub2.val2,
       sub2.y,
       sub2.m,
       sub3.y,
       sub3.m,
       sub3.val3
FROM  (SELECT YEAR(curdate()) AS y, MONTH(curdate()) AS m) Sub0
LEFT JOIN(SELECT YEAR(curdate()) AS y,
          MONTH(curdate()) AS m,
          SUM(totwdisc) AS val1
   FROM pro_partial_inv
   WHERE paidd IS NOT NULL
     AND bringbar=0
     AND YEAR(curdate())=YEAR(paidd)
     AND MONTH(curdate())=MONTH(paidd)
   GROUP BY y,
            m) sub1
ON sub0.y=sub1.y
AND sub0.m=sub1.m
LEFT JOIN
  (SELECT YEAR(curdate()) AS y,
          MONTH(curdate()) AS m,
          SUM(netto) AS val2
   FROM pro_partial_inv
   WHERE paidd IS NULL
     AND bringbar=0
     AND YEAR(curdate())=YEAR(pdate2)
     AND MONTH(curdate())=MONTH(pdate2)
   GROUP BY y,
            m) sub2
ON sub0.y=sub2.y
AND sub0.m=sub2.m
LEFT JOIN
  (SELECT YEAR(curdate()) AS y,
          MONTH(curdate()) AS m,
          SUM(totwdisc) AS val3
   FROM pro_partial_inv
   WHERE paidd IS NOT NULL
     AND bringbar=1
     AND YEAR(curdate())=YEAR(pdate2)
     AND MONTH(curdate())=MONTH(pdate2)
   GROUP BY y,
            m) sub3 
ON sub0.y=sub3.y
AND sub0.m=sub3.m

または簡単なタッチ:-

SELECT sub0.y,
       sub0.m,
       sub1.val1,
       sub2.val2,
       sub3.val3
FROM  (SELECT YEAR(curdate()) AS y, MONTH(curdate()) AS m) Sub0
LEFT JOIN(SELECT YEAR(paidd) AS y,
          MONTH(paidd) AS m,
          SUM(totwdisc) AS val1
   FROM pro_partial_inv
   WHERE paidd IS NOT NULL
     AND bringbar=0
   GROUP BY y,
            m) sub1
ON sub0.y=sub1.y
AND sub0.m=sub1.m
LEFT JOIN
  (SELECT YEAR(pdate2) AS y,
          MONTH(pdate2) AS m,
          SUM(netto) AS val2
   FROM pro_partial_inv
   WHERE paidd IS NULL
     AND bringbar=0
   GROUP BY y,
            m) sub2
ON sub0.y=sub2.y
AND sub0.m=sub2.m
LEFT JOIN
  (SELECT YEAR(pdate2) AS y,
          MONTH(pdate2) AS m,
          SUM(totwdisc) AS val3
   FROM pro_partial_inv
   WHERE paidd IS NOT NULL
     AND bringbar=1
   GROUP BY y,
            m) sub3 
ON sub0.y=sub3.y
AND sub0.m=sub3.m

またはさらに単純化

SELECT YEAR(curdate()) AS y, 
        MONTH(curdate()) AS m,
        SUM(IF(paidd IS NOT NULL AND bringbar=0, totwdisc, 0)),
        sub2.val2,
        sub2.val3
FROM  pro_partial_inv
LEFT JOIN
  (SELECT YEAR(pdate2) AS y,
          MONTH(pdate2) AS m,   
          SUM(IF(paidd IS NULL AND bringbar=0, netto, 0)) AS val2,
          SUM(IF(paidd IS NOT NULL AND bringbar=0, totwdisc, 0)) AS val3
   FROM pro_partial_inv
   GROUP BY y,
            m) sub2
ON sub0.y=sub2.y
AND sub0.m=sub2.m
GROUP BY y, m
于 2013-06-26T13:26:31.470 に答える
0

これには結合を使用する必要はありません。3 つの個別のクエリを実行して、必要な結果を得ることができます。

SELECT 
    (SELECT SUM(netto) FROM ...) as sub1,
    (...) as sub2,
    (...) as sub3

各サブクエリに適切な WHERE 句をすべて追加するだけです。

于 2013-06-26T13:23:22.073 に答える
0

MySQL には存在FULL JOINしないため、適切な年と月のペアのセットで左結合する必要があります。あなたの場合、1つしかないので:

select ...
from (select year(curdate()) as y, month(curdate()) as m) cur
left join (...) as sub1 on cur.y = sub1.y and cur.m = sub1.m
left join (...) as sub2 on cur.y = sub2.y and cur.m = sub2.m
left join (...) as sub3 on cur.y = sub3.y and cur.m = sub3.m;
于 2013-06-26T13:34:55.343 に答える