【问题标题】:MySQL Join three different results and countMySQL Join 三个不同的结果并计数
【发布时间】:2013-09-12 11:20:19
【问题描述】:

从三个不同的表中提取了三个结果。

每个表都是一个产品:loanscreditsdiscounts

贷款和信用得到以下数据:clientidtypeproductiddate & expiration(还有几天)。 获得的折扣:clientiddateexpiration

结果是每个客户的产品在 10 天(或更短)内到期并在两个日期之间注册的次数(计数)。 示例(仅用于贷款):

SELECT clientid, COUNT(*)
FROM loans
WHERE ((type LIKE 'TITULAR') AND(date BETWEEN 'ccyy-mm-dd' AND 'ccyy-mm-dd') AND (expires <= 10))
GROUP BY clientid
ORDER BY clientid;

显然,并非所有客户都同时获得贷款、信贷或折扣,但我需要得到一个结果,即在限制日期内任何客户的任何产品在 10 天或更短时间内到期的次数总和.

因此,例如,如果客户 #200 获得 3 笔贷款、2 笔信贷和 1 次折扣;所有这些都在 date1 和 date2 之间,到期时间等于或小于 10;结果应该是 6。

到目前为止我已经尝试过:

SELECT loansr.clienteid, (loansr.count + creditsr.count + discountsr.count)
FROM
    (SELECT clienteid, COUNT(*) AS "count"
    FROM loans
    WHERE (type LIKE 'TITULAR') 
    AND (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires <= 10)
    GROUP BY clienteid) loansr,
    (SELECT clienteid, COUNT(*) AS "count"
    FROM credits
    WHERE (type LIKE 'TITULAR') 
    AND (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires <= 10)
    GROUP BY clienteid) creditsr,
    (SELECT clienteid, COUNT(*) AS "count"
    FROM discounts
    WHERE (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires <= 10)
    GROUP BY clienteid) discountsr
WHERE
    (loansr.clienteid = creditsr.clienteid = discountsr.clienteid)
ORDER BY loansr.clienteid;

编辑 18:25 我认为如果我使用 UNION ALL 混合三个结果,然后按 clienteid 分组,我会得到我想要的,不是吗?

SELECT clienteid AS "CLIENTE", SUM(COUNT) AS  "NUM_VECES_INCI_10_ACT_U3M" FROM
    ((SELECT clienteid, COUNT(*) AS "COUNT"
    FROM loans
    WHERE (titularidad_tipo LIKE 'TITULAR') 
    AND (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires >= 11)
    GROUP BY clienteid)
        UNION ALL
    (SELECT clienteid, COUNT(*) AS "COUNT"
    FROM credits
    WHERE (titularidad_tipo LIKE 'TITULAR') 
    AND (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires >= 11)
    GROUP BY clienteid)
        UNION ALL
    (SELECT clienteid, COUNT(*) AS "COUNT"
    FROM discounts
    WHERE (date BETWEEN '2009-08-01' AND '2009-10-30')
    AND (expires >= 11)
    GROUP BY clienteid)) orig
GROUP BY clienteid
ORDER BY clienteid;

【问题讨论】:

    标签: mysql join sum


    【解决方案1】:

    如果可以的话,我会在评论中发布:) 如果你使用 UNION ALL,你应该得到想要的结果。尽管要确保为表 loanr、credits 和(date,expires)表提供适当的索引(我建议为 titularidad_tipo、date、expires)和 discounts 表。如果你有适当的索引,你的结果会很快出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2016-10-07
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多