【发布时间】:2013-02-09 20:26:28
【问题描述】:
我正在使用以下查询从三个表中对客户的工作时间和费用进行分组,一张用于客户,一张用于工作时间,一张用于费用:
SELECT a.*,
COALESCE(b.totalCount, 0) AS CountWork,
COALESCE(b.totalAmount, 0) AS WorkTotal,
COALESCE(c.totalCount, 0) AS CountExpense,
COALESCE(c.totalAmount, 0) AS ExpenseTotal
FROM clients A
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount
FROM work_times
WHERE DATE BETWEEN '2013-01-01' AND '2013-02-01'
GROUP BY Client
) b ON a.Client = b.Client
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount
FROM expenses
WHERE DATE BETWEEN '2013-01-01' AND '2013-02-01'
GROUP BY Client
) c ON a.Client = c.Client
WHERE b.Client IS NOT NULL OR
c.Client IS NOT NULL
您可以看到查询在小提琴here 中工作。
我正在尝试修改此查询,以便每个客户每个月都有一行,按月排序,然后按客户排序。我正在尝试使用以下修改后的查询来做到这一点:
SELECT a.*,
COALESCE(b.totalCount, 0) AS CountWork,
COALESCE(b.totalAmount, 0) AS WorkTotal,
COALESCE(c.totalCount, 0) AS CountExpense,
COALESCE(c.totalAmount, 0) AS ExpenseTotal
FROM clients A
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount,
SUBSTR(Date, 1, 7) as Month
FROM work_times
GROUP BY Month,Client
ORDER BY Month
) b ON a.Client = b.Client
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount,
SUBSTR(Date, 1, 7) as Month
FROM expenses
GROUP BY Month,Client
ORDER BY Month,Client
) c ON a.Client = c.Client
WHERE b.Client IS NOT NULL OR
c.Client IS NOT NULL
您可以看到修改后的查询在运行here。
但它的工作并不完全正确。即使有 2013 年 1 月的工作时间和 2013 年 2 月的费用(因此应该有 2 行),客户 B 也只返回一行,并且看起来这些行是由客户而不是按月排序的。有人可以建议如何修改查询以获得所需的输出,对于第二个小提琴上的示例来说,它是:
╔════════╦═══════════╦═══════════╦══════════════╦══════════════╗
║ CLIENT ║ COUNTWORK ║ WORKTOTAL ║ COUNTEXPENSE ║ EXPENSETOTAL ║
╠════════╬═══════════╬═══════════╬══════════════╬══════════════╣
║ A ║ 1 ║ 10 ║ 1 ║ 10 ║
║ B ║ 1 ║ 20 ║ 0 ║ 0 ║
║ A ║ 1 ║ 15 ║ 0 ║ 0 ║
║ B ║ 0 ║ 0 ║ 1 ║ 10 ║
║ C ║ 1 ║ 10 ║ 0 ║ 0 ║
╚════════╩═══════════╩═══════════╩══════════════╩══════════════╝
【问题讨论】:
-
两个子选择不需要
ORDER BY。把它作为最终答案。 -
如果 date 是 datetime 数据类型,为什么/如何对它执行 substring()?
-
您的表格有多余的数据、数量和日期。您需要进一步规范您的结构并消除冗余。查询过于模糊,您希望查看特定数据,但除了 client id is not null 之外的任何选择中都没有任何条件。如果您想查看指定日期范围内的数据,按月份分组,然后查询日期。我会退后一步,将规范化视为我的第一个问题。
-
@JustAguy 我不确定你的意思。我使用金额来计算 SUM 和按月分组的日期。
标签: sql inner-join