如何停止这种重复和按日期分组

时间:2018-01-24 11:25:43

标签: mysql sql

多次尝试后,我无法从查询中获得所需的结果。

SELECT 
cc.date as credi_date,
cd.date as debit_date,
cd.month AS month,
ROUND(IFNULL(cc.credit_amount,0),2) AS credit,
ROUND(IFNULL(cd.debit_amount,0),2) AS debit
FROM 
(SELECT
DATE(cc.credit_date) as date,
MONTHNAME(cc.credit_date) as month,
IFNULL(SUM(cc.credit_amount),0) AS credit_amount
FROM
cust_credit cc 
WHERE YEAR(cc.credit_date) = YEAR(NOW()) 
GROUP BY DATE(cc.credit_date)) cc

INNER JOIN 

(SELECT
 DATE(cd.debit_date) as date,
MONTHNAME(cd.debit_date) as month,
IFNULL(SUM(cd.debit_amount),0) AS debit_amount
FROM
cust_debit cd
WHERE YEAR(cd.debit_date) = YEAR(NOW()) 
GROUP BY DATE(cd.debit_date)) cd ON cc.month=cd.month

问题是此查询多次重复rows次。我不知道是什么导致了这种重复,以及如何解决这个问题。 image结果如下所示。

Result

我要求的结果是

Required

我的信用表在下面给出

credit table

我的借记表在下面给出

debit table

2 个答案:

答案 0 :(得分:0)

Yon应该在子查询中使用UNION,然后在SELECT中使用GROUP BY:

SELECT my_date, 
       my_month, 
       SUM(credit), 
       SUM(debit)
FROM (
    SELECT cc.credit_date as my_date,
           MONTHNAME(cc.credit_date) as my_month,
           ROUND(SUM(IFNULL(cc.credit_amount,0)),2) AS credit,
           0 AS debit
    FROM   cust_credit cc
    WHERE YEAR(cc.credit_date) = YEAR(NOW()) 
    GROUP BY cc.credit_date,
             MONTHNAME(cc.credit_date)
    UNION
    SELECT 
           cd.debit_date ,
           MONTHNAME(cd.debit_date) ,
           0 ,
           ROUND(SUM(IFNULL(cd.debit_amount,0)),2)
    FROM   cust_debit cd
    WHERE YEAR(cd.debit_date) = YEAR(NOW()) 
    GROUP BY cd.debit_date, 
             MONTHNAME(cd.debit_date) 
) as TT
GROUP BY my_date,my_month

This is the Fiddle

答案 1 :(得分:0)

基本上,您的结果是两个查询之间的交叉联接,这就是您获得跨产品的原因,即total number of rows from credit x total number of rows from debit

因为借方和贷方表中所有行的月份相同(即January)。但是,您在两个表格中都有唯一的date

因此,进行以下更改应该可以为您提供预期的输出。

ON cc.month=cd.month

ON cc.date = cd.date