2013-06-09 2 views
1

У меня есть таблица, содержащая имя магазина, даты продажи и продающиеся:Sql расчет процентов и группировка

Shop | Date | Item 

Shop1 | xxxxx | A 
Shop1 | xxxxx | B 
Shop1 | xxxxx | B 
Shop1 | xxxxx | A 
Shop1 | xxxxx | A 

Так они продали 3 шт «A» и 2 ст «B»

Так что, пункт а (3 продано) составляет 60% от общего числа (5 проданных товаров) и пункт Б 40%

Так что я хотел бы получить что-то вроде этого:

Shop1 | A | 3 | 60% 
Shop1 | B | 2 | 40% 

Оно должно быть получено:

Select Shop, item, count(item), count(item) *100/(select count(item) from table) + '%' 
from table 
group by Shop, item; 

Моя проблема заключается в том, что таблицы не содержит только один магазин, но другие магазины тоже: shop1, Shop2 и так далее.

Так что я хотел бы получить результат, как этот:

Shop1 | A | 3 | 60% 
Shop1 | B | 2 | 40% 
Shop2 | A | 8 | 80% 
Shop2 | B | 2 | 20% 
shop3 | A | 1 | 100% 
shop4…… 

Любая помощь?

+1

Какая система баз данных вы используете? –

ответ

0

должно работать:

Select i.Shop, 
     i.item, 
     count(i.item), (count(i.item) * 100/t.cnt) 
    from table1 i 
    join (select shop, count(shop) as cnt from table1 group by shop) t 
    on i.shop = t.shop 
group by i.Shop, i.item, t.cnt 

смотри также этот sqlfiddle

1

В SQLServer2005 +

SELECT shop, item, 
     COUNT(*) * 100./SUM(COUNT(*)) OVER(PARTITION BY shop) AS Perc 
FROM dbo.YourTable 
GROUP BY shop, item 
ORDER BY shop, item 

Demo SQLFiddle

+0

@Aesse Добро пожаловать в stackoverflow ... Вам нужно прочитать эти сообщения: Как работает прием ответа? http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

0

Вы можете попробовать это:

 
SELECT DISTINCT(A.SHOP) ,A.ITEM ,COUNT(A.ITEM) ITEMS ,CAST(COUNT(A.item) * 100/B.COUNT_OF_SHOP AS VARCHAR(10)) + '%' 
FROM percentage A JOIN 
(SELECT shop ,COUNT(shop) AS COUNT_OF_SHOP FROM percentage GROUP BY shop) B ON A.shop = B.shop 
GROUP BY A.Shop ,B.shop ,A.item ,B.COUNT_OF_SHOP 
1

Я создаю таблицу с 20000 случайными значениями и проверил 3 выше ответа и обнаружил, что ответ Федоренко быстрее, чем benty23. В плане запроса 0.250533 был для Федоренко и 0.354073 для benty23. Таким образом, использование оконных функций для этого вопроса является лучшим решением.

+0

Да, они работают очень хорошо, и это то, что я точно искал. огромное спасибо за помощь. – Aesse

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