2016-08-05 3 views
1

У меня есть таблица, содержащая множество различных продуктов. В настоящее время я могу подсчитать количество заказов на продукт ID, используя запрос типа:Поиск процента в строке сгруппированной таблицы

SELECT ProductId, COUNT(*) as NumOrders from Orders 
    GROUP BY ProductId; 

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

SELECT ProductId, COUNT(*) as NumCriteria from Orders 
    WHERE HasCriteria = 1 
    GROUP BY ProductId; 

Это дает мне подобную таблицу идентификаторов продукта и количество заказов этого продукта, но меньшего числа из-за не все заказы соответствуют этим критериям.

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

SELECT Product ID, 
     COUNT(*meets criteria*), 
     COUNT(*total*), 
     (COUNT(*meets criteria*) * 100/COUNT(*total*)) 

Так что мой выход дает мне что-то вроде этого:

ProductID  | NumCriteria | NumOrders | Percent 
0001   | 5    | 10   | 50 
0002   | 4    | 20   | 20 
0003   | 2    | 6   | 33 

До сих пор все методы я видел, чтобы вычислить процент чем-то для подсчета какой процент строк в таблице соответствуют критериям, но мне нужен процент за каждый идентификатор продукта в таблице. Есть ли способ сделать это в одном запросе?

EDIT: Необработанная таблица - это заказы, содержащие идентификатор заказа, идентификатор продукта и информацию о клиенте. Те же самые продукты появляются в нескольких заказах. Краткий пример будет:

Order ID | Product ID | Other info... 
001  | 0002  | ... 
002  | 0002  | ... 
003  | 0001  | ... 
004  | 0003  | ... 
005  | 0001  | ... 
006  | 0002  | ... 
007  | 0004  | ... 

Таким образом, результат первого запроса на этой таблице будет:

Product ID | NumOrders 
0001  | 2 
0002  | 3 
0003  | 1 
0004  | 1 
+0

Можете ли вы предоставить образцы данных? – kbball

+0

Приведенный небольшой пример таблицы выше. –

ответ

1

Нечто подобное т o ниже может получить то, что вы ищете. Когда критерии не удовлетворяются для некоторых идентификаторов productID, строка будет отображаться в столбце null.

SELECT 
A.Product ID, 
B.NumCriteria, 
A.count(*) as total, 
((B.NumCriteria*100)/A.count(*)) 
FROM 
Orders as A 
LEFT JOIN (SELECT 
     ProductID, 
     count(*) as NumCriteria 
    FROM 
     Orders 
    WHERE 
     HasCriteria = 1 
    GROUP BY ProductID) as B 
ON A.ProductID = B.ProductID 
GROUP BY ProductID 
+1

Это выглядит многообещающе! Моя фактическая таблица включает в себя пару подключений, поэтому будет немного сложно работать, но, надеюсь, это сработает! –

+0

В худшем случае вы всегда можете сделать все вышеперечисленное подзапросом внутри всего вашего заявления и затем потенциально присоединиться к productID. Просто будьте осторожны, чтобы не раздувать группу непреднамеренными дополнительными столбцами. – Zi0n1

+1

Мне это удалось, и он работает! Большое спасибо! –

1

Может быть это с помощью КИО присоединиться к временной таблице для получения общего

Может быть это с помощью iiner присоединиться к временной таблице для получения общего

SELECT a.`Product ID` 
    , COUNT(a*) AS `count` 
    , t.cnt as Total  
FROM Orders a 
INNER JOIN (select `Product ID`, count(distinct Order ID) as total 
       from orders 
       group by `Product ID`) t on a.`Product ID` = t.`Product ID` 
GROUP BY a.Product ID` 
+0

Не будет ли «Total» в данном случае общее количество строк в таблице? «Всего» мне нужно общее количество заказов этого продукта для каждого продукта в таблице. –

Смежные вопросы