【问题标题】:Counting multiple columns based on datetable - MySQL基于日期表计算多列 - MySQL
【发布时间】:2013-09-11 20:23:30
【问题描述】:

使用日期表,我试图根据周数计算不同的列。 我设法用一列来做到这一点,而且效果很好。但是当我计算多列时,我得到错误或重复的结果。我想是因为加入。

这适用于预期的一列:

 SELECT
 DATE_FORMAT(thedate, '%u') as week
,COUNT(t.completed_date) as completed

FROM datetable
LEFT JOIN projects t ON t.completed_date = thedate
WHERE thedate BETWEEN YEAR(NOW()) AND NOW()
GROUP BY YEARWEEK(thedate,7)

通过将,COUNT(t.sales_date) as sales 添加到选择中,我将获得已完成和销售的重复计数。

基于此示例(项目)

| id | completed_date | sales_date |
| 1  | NULL           | NULL       |
| 2  | NULL           | 2013-08-26 |
| 3  | NULL           | 2013-08-28 |
| 4  | 2013-09-06     | NULL       |

我正在寻找

| week | completed | sales |
| 34   | 0         | 0     |
| 35   | 0         | 2     |
| 36   | 1         | 0     |

我正在使用日期表,因为当没有日期时,我需要所有日期都为 0。 我想我可以通过子查询来解决它,但是在这个查询中我还需要计算其他 12 个日期字段(从示例中排除)。

有没有比使用大量子查询更好的方法来解决这个问题?我的 SQL 有点生疏了。

【问题讨论】:

    标签: mysql sql join count


    【解决方案1】:

    一种方法是使用子查询将每个值按周分组,然后将它们全部连接在一起。

    SELECT d.week, completed, sales
    FROM (SELECT YEARWEEK(thedate) week
          FROM datetable
          WHERE thedate BETWEEN YEAR(NOW()) AND NOW()
          GROUP BY week) d
    LEFT JOIN (SELECT YEARWEEK(completed_date) week, COUNT(*) completed
               FROM projects
               WHERE completed_date BETWEEN YEAR(NOW()) AND NOW()
               GROUP BY week) c
    ON c.week = d.week
    LEFT JOIN (SELECT YEARWEEK(sales_date) week, COUNT(*) sales
               FROM projects
               WHERE sales_date BETWEEN YEAR(NOW()) AND NOW()
               GROUP BY week) s
    ON s.week = d.week
    

    这种方式更容易扩展到其他列:

    SELECT DATE_FORMAT(thedate, '%u') AS week,
           IFNULL(SUM(completed_date = thedate), 0) AS completed,
           IFNULL(SUM(sales_date = thedate), 0) AS sales
    FROM datetable
    LEFT JOIN projects
    ON thedate IN (completed_date, sales_date)
    WHERE thedate BETWEEN YEAR(NOW()) AND NOW()
    GROUP BY week
    

    【讨论】:

    • 谢谢,但如上所述;当我再添加 12 个子查询时,我想一定有更简单的方法。
    • 新增了一个查询,是不是更好?
    • 这要好得多,但即使我添加了 WHERE 子句也很慢。它在 1 秒内返回 10 行。我可能只是用循环创建第一个查询并使用它。
    • 不幸的是,第二个查询不能非常有效地使用索引,因为它匹配thedateprojects 中的多个列。
    • 我明白了,那我现在就继续使用子查询,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    相关资源
    最近更新 更多