【问题标题】:How to stop this repetition and group by date如何停止这种重复并按日期分组
【发布时间】:2018-01-24 11:25:43
【问题描述】:

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

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如下所示。

我需要的结果是

我的信用表如下

我的借记表如下

【问题讨论】:

  • 我不确定您是否真的需要使用子查询。您是否尝试过在 SELECT 之后放置一个 DISTINCT,直接使用 cust_credit 和 cust_debit 而不是子查询并将结果分组?还要检查您的 INNER JOIN 条件
  • 为什么不使用 DISTINCT 子句?
  • @kiks73 不,我没有尝试过 DISTINCT,问题在于ON 子句。
  • @GarimaGupta 是更好的方法吗?
  • @GarimaGupta 面临同样的问题 ...

标签: mysql sql


【解决方案1】:

你应该在子查询中使用 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

【讨论】:

  • 完成了先生...非常感谢,我对您的答案进行了一些更改以获得所需的结果...
【解决方案2】:

基本上,您的结果是两个查询之间的交叉连接,这就是您获得交叉产品的原因,即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

【讨论】:

  • 正确,但是如果在特定日期没有发生贷方交易并且发生借方交易,例如2018-01-10required image 中给出了问题,那么结果将是什么都不会-显示如果我在credit_date = debit_date 上使用了WHERE 子句!那么如何克服这个问题呢?
  • @Newbees 你需要使用FULL OUTER JOIN,这似乎在MySQL 中不存在。但解决方法是,将LEFTUNION 一起使用。
  • @Newbees 但是,等等,我看到信用表中有一行2018-01-10 的金额为0
  • 这个查询正在工作,但并不是因为它从借记表中跳过了许多日期......第二件事让,在某个日期的credit table 中没有行,但在表的debit table 中存在,比你想象的要有效ON cc.date = cd.date
  • @Newbees 如果您阅读了我之前明确提到的评论,FULL OUTER JOIN,它似乎在 MySQL 中不存在。但解决方法是,一起使用 LEFT 和 UNION
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 2017-06-03
  • 2013-08-08
相关资源
最近更新 更多