我有这个sql的问题,按商店,月份和年份排名前5位
SELECT YEAR(t1.date_at) as year,
MONTH(t1.date_at) as month,
(SELECT COUNT(t2.ticket)
FROM sac as t2
WHERE MONTH(t2.date_at) = MONTH(t1.date_at)
AND YEAR(t2.date_at) = YEAR(t1.date_at)
ORDER BY t2.ticket DESC LIMIT 5 ) AS total
FROM sales as t1
WHERE YEAR(t1.date_at) = 2017
GROUP BY YEAR(t1.date_at),MONTH(t1.date_at)
结果很完美:
2017|1|18977
2017|2|9846
2017|3|270
但我需要添加商店 我将商店添加到sql:
SELECT t1.store,YEAR(t1.date_at) as year,
MONTH(t1.date_at) as month,
(SELECT COUNT(t2.ticket)
FROM sac as t2
WHERE MONTH(t2.date_at) = MONTH(t1.date_at)
AND YEAR(t2.date_at) = YEAR(t1.date_at)
AND t2.store = t1.store
ORDER BY t2.ticket DESC LIMIT 5 ) AS total
FROM sales as t1
WHERE YEAR(t1.date_at) = 2017
GROUP BY t1.store, YEAR(t1.date_at),MONTH(t1.date_at)
结果是一个无限的小伙伴。
理想的结果是:
YEAR|MONTH|TOTAL|STORE
2017|1|18977|20041
2017|1|17900|345
2017|1|10000|74544
2017|1|8988|2453
2017|1|6942|1056
2017|2|9846|675
2017|2|6487|3421
2017|2|5000|165
2017|2|4785|76
2017|2|699|211
...
...
...
错误在哪里?
答案 0 :(得分:0)
评论太长了。可以延伸到稍后的答案。
您的查询没有,您认为它做了什么。
但首先,问题是,为什么你甚至从销售表中读到,当你显然在囊表中有所有东西?这使得一切都变得更加复杂。
那么为什么你的查询错了? LIMIT 5
适用于整个查询。你使用LIMIT
子句所做的就是先计算出最高数字的门票,这完全没有意义。
你问题的标题是“按店铺,月份和年份排名前五”。要使用您的方法,您必须在子查询中添加GROUP BY
和LIMIT
子句,但这也不会起作用,因为子查询(因为它在SELECT子句中)是不允许返回多行。
再次,您在标题中说“商店,月份和年份的前五名销售额”,但您现在的结果和现在的“理想结果”都没有反映出来。我没有看到有关“前5名”的任何信息。这就是为什么你的问题完全令人困惑的原因。
答案 1 :(得分:0)
好的,因为你可以从一个表中获取所有内容所以编写查询就像下面这样简单(这里我将表名称视为Ticket):
SELECT t1.store, MONTH(t1.date_at) as m, YEAR(t1.date_at) as y, COUNT(t1.ticket) as total
from Ticket t1
GROUP BY t1.store,MONTH(t1.date_at),YEAR(t1.date_at)
order by COUNT(t1.ticket) DESC LIMIT 5
上述查询将获取您想要的结果: 结果:
+------+-------+------ +-------+
| store| m | y | total |
+------+-------+-------+-------+
| 10 | 04 | 2017 | 2 |
| 11 | 04 | 2017 | 1 |
| 11 | 03 | 2017 | 1 |
+--------+-----+------+--------+
虽然我不知道您使用的是哪种类型的数据库,但查询语法可能会根据数据库类型而改变。但查询结构将保持不变。