Сгруппировать с разным процентом MySQL - PullRequest
3 голосов
/ 12 октября 2011

Я пытался запросить процент увеличения продукта, сгруппированного в определенном диапазоне, в зависимости от фактического увеличения для каждого прогона. Так, например, у меня есть следующая схема таблицы

product table

Теперь, если я запросить процент увеличения, я получу что-то вроде:

SELECT *, (((newPrice - price)/price) * 100 ) as PERCENTAGE FROM Product

products with their respective percentage

То, что я пытаюсь получить, это сгруппировать значения в пределах определенного диапазона в зависимости от рассчитанного увеличения. Так что для этого запустите что-то вроде этого:

| Range   | #COUNT    |
| 0-10%   | 3         | 
| 30-40%  | 1         | 

и более диапазонов и продуктов, если таковые имеются

Я пытался:

Select *, COUNT(idProduct) AS COUNT FROM Product 
where (((newPrice - price)/price) * 100 ) BETWEEN 0 AND 10

что дает мне:

enter image description here

Но мне нужно настроить запрос таким образом, чтобы он мог определить разумный процентный диапазон (т. Е. Без жесткого кодирования значений МЕЖДУ 0 И 10 ) и сгруппировать значения в нем для разных пробегов. Есть идеи?

Спасибо!


таблица продуктов

CREATE  TABLE `product` (    
  `idproduct` INT NOT NULL ,    
  `description` VARCHAR(45) NULL ,    
  `price` INT NULL ,    
  `newPrice` INT NULL ,    
  PRIMARY KEY (`idproduct`) );

Ответы [ 3 ]

9 голосов
/ 12 октября 2011

Вы можете group by 10% процентные полосы:

SELECT  floor((newPrice - price) / price * 10) * 10 as LowerBound
,       floor((newPrice - price) / price * 10) * 10 + 10 as HigherBound
,       count(*) as Count
FROM    Product
GROUP BY
        floor((newPrice - price) / price * 10)

Умножение на 10 и округление в меньшую сторону должно создать одну группу на 10 процентных пунктов.

1 голос
/ 12 октября 2011
SELECT
  r.RangeValue,
  COUNT(*) AS CountofProducts
FROM (SELECT 
        CASE WHEN (((newPrice - price)/newPrice) * 100 ) <= 10 THEN
          '0-10%'
        WHEN (((newPrice - price)/newPrice) * 100 ) <= 20 THEN
          '10-20%'
        WHEN (((newPrice - price)/newPrice) * 100 ) <= 30 THEN
          '20-30%'
        WHEN (((newPrice - price)/newPrice) * 100 ) <= 40 THEN
          '30-40%'
        ELSE
          '40+%'
        END AS RangeValue
      FROM Product) r
GROUP BY r.RangeValue
0 голосов
/ 12 октября 2011

Это просто Выберите количество (*) как элементы, (((newPrice - цена) / newPrice) * 100) как PERCENTAGE,

ЕСЛИ ( ((newPrice - цена) / newPrice * 100)> = 0 &&
((newPrice - цена) / newPrice * 100) <= 10, «0 - 10%», ЕСЛИ ( ((newPrice - цена) / newPrice * 100)> = 11 &&
((новая цена - цена) / новая цена * 100) <= 30, "10 - 30%", <em> и так далее. ) ) AS 'range'

ИЗ ПРОДУКТА сгруппировать по диапазону

По сути, вы должны использовать вложенные операторы if (), а внутри них вы должны помещать диапазоны.

Тогда дайте ему значимый псевдоним. Затем вы можете группировать по псевдониму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...