2017-09-13 16 views
1

我有一个产品数据库,我希望能够选择8个定价折扣组中每个产品的计数。MySql试图选择分组方式,计算范围为

查询结果将为两列,一列为定价折扣组,另一列为该组内的产品数量。

定价折扣是在此基础上计算:

(100-pSalesPrice/pPrice)

这将导致在一个有理数0-100

这个SELECT语句之间:

SELECT (100-100*pSalesPrice/pPrice) as pDisc, count(*) FROM ds_products where 1 GROUP BY (100-100*pSalesPrice/pPrice) 

结果于:

0.000000 44 
0.111114 1 
1.033332 3 
3.128208 3 
3.142853 2 

... ECT对线

我想什么了数百是由只有8范围分组,这样的结果:

15 12 
25 84 
35 72 
45 11 
55 102 
65 36 
75 12 
76 3 

其中每个范围是:

15 = 0-15 
25 = 16-25 
35 = 26-35 
45 = 36-45 
55 = 46-55 
65 = 56-65 
75 = 66-75 
76 = 76-100 

目前,我的计划是一个新的字段添加到我叫pDiscountGroup产品数据库和更新这些对每个产品......但我不想多添加到我的产品数据库,如果我没有。

是否有一个漂亮的MySQL查询可以完成我想要的?

回答

0

你可以使用的情况下,当为构建你所需要的范围

SELECT 
    case when (100-100*pSalesPrice/pPrice) <= 15 then 15 
     when (100-100*pSalesPrice/pPrice) > 15 and (100-100*pSalesPrice/pPrice) <= 25 
                then 25 
     when (100-100*pSalesPrice/pPrice) > 25 and (100-100*pSalesPrice/pPrice) <= 35 
                then 35 
       .... 
       .... 
     when (100-100*pSalesPrice/pPrice) > 75 then 100 
     end as pDisc 
    , count(*) 
    FROM ds_products 
    GROUP BY pDisc 
+0

我喜欢这里的想法,它似乎工作 - 但它给了我一个非常奇怪的服务器错误,我从来没有在phpMyAdmin之前见过。 –

+0

这对我有用,但我不喜欢服务器错误。这不是一个阻止我使用查询的错误,但它确实提到错误报告给虚拟主机....(Bluehost)。 –

+0

工作! CASE ... END需要在() –

0

你可以添加例如另一个表带有3列的groupspriceGroup, min, max(或相似的名称)。在此表哟添加范围,如在你的问题中定义:

priceGroup min max 
15   0 15 
25   16 25 
35   26 35 
45   36 45 
55   46 55 
65   56 65 
75   66 75 
76   76 100 

现在你可以做一个加入到这个表

SELECT g.priceGroup, count(*) 
FROM ds_products p 
    LEFT JOIN groups g ON 
     (100-100*pSalesPrice/pPrice BETWEEN min AND max) 
GROUP BY g.priceGroup 

这个方案的好处是,它是可能的重新排列组,甚至存储组的名称,...