Mysql查询[0002]

时间:2013-05-10 09:59:49

标签: mysql sql database

所以我有两个Mysql表,我很难做以下查询。

查询:获取每个城市每月的销售额

用户 id,name,city

销售 * id,user_id,名称,金额,日期(日期时间)*

我从SELECT MONTHNAME(datetime) AS month GROUP BY month.

开始

提前致谢!

3 个答案:

答案 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按月添加小计,最后添加总计。

PS:我同意这些意见,你应该在解决你的问题时付出更多的努力,你不是新的,所以你应该意识到这一点;)

答案 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个月的范围。