所以我有两个Mysql表,我很难做以下查询。
查询:获取每个城市每月的销售额
用户 id,name,city
销售 * id,user_id,名称,金额,日期(日期时间)*
我从SELECT MONTHNAME(datetime) AS month GROUP BY month.
提前致谢!
答案 0 :(得分:1)
嘿noob(好名字顺便说一句):D
试试这个,我在YEAR()
子句中添加了GROUP BY
,因为每月的月号重复,我想你不想要同月的记录销售总和但年份不同。如果您不想要,可以在SELECT
语句中省略年份。
SELECT YEAR(S.date) AS Year
, MONTHNAME(S.date) AS Month
, U.city
, SUM(S.amount) AS SalesPerMonthPerCity
FROM sales S
INNER JOIN users U ON U.id = S.user_id
GROUP BY YEAR(S.date), MONTH(S.date), U.city
答案 1 :(得分:1)
您有一个SQL Fiddle test page,以便您和其他人可以尝试解决方案。
这是有问题的查询:
SELECT MONTHNAME(`date`) AS Monthly
, `city`
, SUM(`amount`) AS Profit
FROM sales
INNER JOIN users ON userid = idu
GROUP BY MONTHNAME(`date`), `city` WITH ROLLUP
使用WITH ROLLUP
按月添加小计,最后添加总计。
答案 2 :(得分:1)
假设您想要任何月份和/或城市没有任何销售的数字为0,但是那个月其他城市的销售情况如下: -
交叉加入一对子选择,一个用于获取所用月份的列表,一个用于获取城市列表,然后根据记录加入那些以获取该月/城市的金额,并将这些金额加起来: -
SELECT Sub1.YearMonth, Sub2.city, SUM(sales.amount)
FROM (SELECT DISTINCT EXTRACT(YEAR_MONTH FROM `date`) AS YearMonth
FROM sales) Sub1
CROSS JOIN (SELECT DISTINCT city FROM users) Sub2
LEFT OUTER JOIN sales ON Sub1.YearMonth = EXTRACT(YEAR_MONTH FROM sales.`date`)
LEFT OUTER JOIN users ON sales.user_id = users.id AND Sub2.city = sales.city
GROUP BY Sub1.YearMonth, Sub2.city
ORDER BY Sub1.YearMonth, Sub2.city
这方面的缺点是如果你有一个月没有卖给任何人,那么本月就不会出现。要解决此问题,您需要更改几个月的子选择,而不是采用开始日期,并为每个月添加一系列数字。
生成范围的示例如下: -
SELECT Sub1.YearMonth, Sub2.city, SUM(sales.amount)
FROM (SELECT EXTRACT(YEAR_MONTH FROM DATE_ADD('2009-01-01', INTERVAL a.i*100+b.i*10+c.i MONTH)) AS aMonth
FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c
WHERE DATE_ADD('2009-01-01', INTERVAL a.i*100+b.i*10+c.i MONTH) <= '2014-12-01') Sub1
CROSS JOIN (SELECT DISTINCT city FROM users) Sub2
LEFT OUTER JOIN sales ON Sub1.YearMonth = EXTRACT(YEAR_MONTH FROM sales.`date`)
LEFT OUTER JOIN users ON sales.user_id = users.id AND Sub2.city = sales.city
GROUP BY Sub1.YearMonth, Sub2.city
ORDER BY Sub1.YearMonth, Sub2.city
这个例子给出了2009-01-01和2014-12-01之间的每个月,包括该城市的所有销售额。它将应对长达1000个月的范围。