2017-05-17 38 views
0

月が同じ場合、結果が同じ行になるという問題に直面しています。私はクエリでUNION ALLを使用しています。誰も私の要件に応じて結果を得るためにクエリを使用する方法を助言してください。月が同じ場合、PHPは同じ行に結果を返します

私はコードの下に使用しています:あなたはこれを簡単にで動作するようにするために

SELECT 
    SUM(amount) as amount, 
    DATE_FORMAT(rcvdate,'%M %Y') as rcv, 
    null as recovery 
FROM `advertisercv` 
GROUP BY DATE_FORMAT(rcvdate, '%M %Y') 
UNION all 
SELECT 
    null, 
    DATE_FORMAT(date,'%M %Y') as rcv, 
    SUM(amount) 
FROM `paymentsrec` 
GROUP BY DATE_FORMAT(date, '%M %Y') 
order by rcv 

を持って

SELECT 
    SUM(amount) AS amount, 
    DATE_FORMAT(rcvdate,'%M %Y') as rcv, 
    NULL AS recovery 
FROM `advertisercv` 
GROUP BY DATE_FORMAT(rcvdate, '%M %Y') 
UNION ALL 
SELECT 
    NULL, 
    DATE_FORMAT(date,'%M %Y') AS rcv, 
    SUM(amount) 
FROM `paymentsrec` 
GROUP BY DATE_FORMAT(date, '%M %Y') 
ORDER BY rcv 

sample data

+0

月ごとのグループ。次に、coalesceを使用して、列の最初のNULL以外の値を取得できます。 – kainaw

+0

whats coalesce? –

+0

"mysql coalesce"の検索エンジンを使用することを検討しましたか? – kainaw

答えて

0

、私は強く、それぞれの列に同じ名前を与える示唆副選択:

SELECT 
    SUM(amount) as amount, 
    DATE_FORMAT(rcvdate,'%M %Y') as rcv, 
    null as recovery 
FROM `advertisercv` 
GROUP BY DATE_FORMAT(rcvdate, '%M %Y') 
UNION all 
SELECT 
    null as amount, 
    DATE_FORMAT(date,'%M %Y') as rcv, 
    SUM(amount) as recovery 
FROM `paymentsrec` 
GROUP BY DATE_FORMAT(date, '%M %Y') 
order by rcv 

これで、額、rcv、リカバリを含む複数の行が表示されることがわかります。これらの行をrcvでグループ化する必要があります。

SELECT * FROM (
    SELECT 
    SUM(amount) as amount, 
    DATE_FORMAT(rcvdate,'%M %Y') as rcv, 
    null as recovery 
    FROM `advertisercv` 
    GROUP BY DATE_FORMAT(rcvdate, '%M %Y') 
    UNION all 
    SELECT 
    null as amount, 
    DATE_FORMAT(date,'%M %Y') as rcv, 
    SUM(amount) as recovery 
    FROM `paymentsrec` 
    GROUP BY DATE_FORMAT(date, '%M %Y') 
    order by rcv 
) GROUP BY rcv 

ただし、*はグループ演算子ではありません。同じrcvで複数の行があるときはどうしますか?それらを合計することができます。あなたは最大または最小を得ることができます。あなたが質問を表現したやり方では、最初の非ヌル値である合体を望むように見えます。

SELECT 
    rcv, 
    COALESCE(amount) as amount, 
    COALESCE(recover) as recovery 
FROM (
    SELECT 
    SUM(amount) as amount, 
    DATE_FORMAT(rcvdate,'%M %Y') as rcv, 
    null as recovery 
    FROM `advertisercv` 
    GROUP BY DATE_FORMAT(rcvdate, '%M %Y') 
    UNION all 
    SELECT 
    null as amount, 
    DATE_FORMAT(date,'%M %Y') as rcv, 
    SUM(amount) as recovery 
    FROM `paymentsrec` 
    GROUP BY DATE_FORMAT(date, '%M %Y') 
    order by rcv 
) GROUP BY rcv 

これで、rcv値ごとに1行が得られます。量とリカバリの両方にrcv値ごとに最初のNULL以外の値が含まれます。

+0

大変ありがとうございますが、依然として結果が得られません:( –

関連する問題