我正试图按价格范围从我的数据库中提取产品销售。
我有一个相当复杂的SQL查询,它有效:
SELECT
SUM((t.price-t.discount)*t.quantity) as totalValue,
MAX(t.price) as maxP,
t.range AS score_range,
COUNT(*) AS count
FROM
(SELECT products.price,
salesRecords.discount,
salesRecords.quantity,
CASE WHEN products.price >=0 AND products.price <50 THEN '0-49'
WHEN products.price >=50 AND products.price <100 THEN '50-99'
WHEN products.price >=100 AND products.price <200 THEN '100-199'
WHEN products.price >=200 AND products.price <350 THEN '200-349'
WHEN products.price >=200 AND products.price <350 THEN '200-349'
WHEN products.price >=350 AND products.price <500 THEN '350-499'
WHEN products.price >=500 AND products.price <800 THEN '500-799'
WHEN products.price >=800 AND products.price <1200 THEN '800-1199'
WHEN products.price >=1200 AND products.price <1800 THEN '1200-1799'
WHEN products.price >=1800 AND products.price <2500 THEN '1800-2499'
ELSE '2500 +' END
AS range FROM salesRecords
LEFT JOIN products ON products.id=salesRecords.itemNo
ORDER BY products.price DESC)t
GROUP BY t.range
ORDER BY maxP DESC
希望你能看到这里发生了什么。我们在价格范围内对产品进行分组,对销售额求和,从而获得如下输出:
totalValue maxP score_range count
8381 251.17 200-349 35
32522 199.00 100-199 198
22614 99.95 50-99 271
41825 49.99 0-49 2765
但是,正如您所看到的,使用此特定数据集时,存在许多空白。
我的值只有score_range
s 200-349, 100-199,50-99, 0-49
缺少35-499,500-799等数据。这是因为这些值没有数据......这很好..除了...我将这些数据作为JSON对象注入到AmCharts
雷达图表中,为了使数据对我的应用程序真正有意义,我需要拥有所有范围,并简单地填充它们zeros
,所以我想得到的是:
totalValue maxP score_range count
0 3500 2500 + 0
0 2499 1800-2499 0
0 1799 1200-1799 0
0 1199 800-1199 0
0 799 500-799 0
0 499 350-499 0
8381 251.17 200-349 35
32522 199.00 100-199 198
22614 99.95 50-99 271
41825 49.99 0-49 2765
答案 0 :(得分:0)
你需要一张驾驶桌,所以你有所有范围。这是一个例子:
SELECT tsum.totalValue,
maxP,
range.range AS score_range,
coalesce(count, 0) count
FROM (select '0-49' as range union all
select '50-99' union all
. . .
) as range left outer join
(SELECT SUM((t.price-t.discount)*t.quantity) as totalValue,
MAX(t.price) as maxP,
t.range AS score_range,
COUNT(*) AS count
from (SELECT products.price,
salesRecords.discount,
salesRecords.quantity,
(CASE WHEN products.price >=0 AND products.price <50 THEN '0-49'
WHEN products.price >=50 AND products.price <100 THEN '50-99'
WHEN products.price >=100 AND products.price <200 THEN '100-199'
WHEN products.price >=200 AND products.price <350 THEN '200-349'
WHEN products.price >=200 AND products.price <350 THEN '200-349'
WHEN products.price >=350 AND products.price <500 THEN '350-499'
WHEN products.price >=500 AND products.price <800 THEN '500-799'
WHEN products.price >=800 AND products.price <1200 THEN '800-1199'
WHEN products.price >=1200 AND products.price <1800 THEN '1200-1799'
WHEN products.price >=1800 AND products.price <2500 THEN '1800-2499'
ELSE '2500 +'
END) AS range
FROM salesRecords LEFT JOIN
products
ON products.id=salesRecords.itemNo
)t
) tsum
on ranges.range = tsum.score_range
GROUP BY ranges.range
ORDER BY maxP DESC
然而,这个例子表明你真的想要一个Ranges表,并且定义了范围的限制。然后你可以将整个case语句作为连接。