2013-12-11 4 views
4

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

NAME DATE 
joe 1-1-13 
joe 1-1-13 
joe 1-1-13 
dave 1-1-13 
joe 1-2-13 

я использовал это, чтобы создать & заполнить таблицу

create table #sales (name varchar(10), salesdate date) 
insert into #sales (name, salesdate) 
values ('joe', '01-01-2013'), ('joe','01-01-2013'), 
     ('joe', '01-01-2013'), ('dave','01-01-2013'), 
     ('joe','01-02-2013') 

Я хочу, чтобы запрос, чтобы подтянуть процент каждого менеджера по продажам продажи по дням

(например, на 1-1-13 Joe продано 3 единицы из 4 всего за день (75%) , но я не знаю, как SQL может вытащить ежедневную сумму всех продаж для дневной рег ardless продавца

Это как близко, как я получил.

select name, salesdate, count(*) as "dailyTotal" 
from #sales 
group by name, salesdate 

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

+0

Подождите, я близок к решению. –

ответ

1

Используйте вложенный запрос, чтобы получить суточную всего:

BEGIN 

    create table #sales (name varchar(10), salesdate date) 

    insert into #sales (name, salesdate) values 
     ('joe', '01-01-2013'), 
     ('joe', '01-01-2013'), 
     ('joe', '01-01-2013'), 
     ('dave', '01-01-2013'), 
     ('joe', '01-02-2013'), 
     ('dave', '01-02-2013') 

    SELECT name, salesdate, COUNT(*) AS personDailyTotal, MAX(dailyTotal) AS dailyTotal, 
     (COUNT(*) * 100.0)/MAX(dailyTotal) AS [Percent] 
    FROM #sales 
    INNER JOIN (
     SELECT salesdate as [day], COUNT(*) as dailyTotal 
     FROM #sales 
     GROUP BY salesdate 
    ) AS [Total] ON salesdate = [day] 
    GROUP BY name, salesdate 

END 
+1

Ошибки - Msg 156, Уровень 15, Состояние 1, Строка 2 Неверный синтаксис рядом с ключевым словом «Процент». Msg 156, Level 15, State 1, Line 8 Неверный синтаксис рядом с ключевым словом «ON». –

+0

Хорошо, плохой выбор имени поля - просто поставьте квадратные скобки –

+0

Там вы, добавили весь скрипт, чтобы вы могли видеть его работу.Не забудьте оставить таблицу в конце скрипта, поскольку вы не можете вставить код с командой, чтобы отбросить таблицу в нем. –

10

Не самый элегантный способ сделать это, но вы можете попробовать это -

select [name],[salesdate], COUNT(*) as dayTotal, 
SUM(COUNT(*)) over() as AllSales, 
(COUNT(*) * 1.0)/SUM(COUNT(*)) over() as dayPercent 
FROM [dbo].[sales] 
group by [name], [salesdate] 

Я удалил # в таблице имя. Btw, этот код зависит от предложения OVER(). Вы можете узнать, как обрезать лишние нули самостоятельно.

name salesdate dayTotal AllSales dayPercent 
dave 2013-01-01 1   5   0.200000000000 
joe 2013-01-01 3   5   0.600000000000 
joe 2013-01-02 1   5   0.200000000000 

HTH.

Если этот запрос выглядит слишком сложным для вас, сначала посмотрите на него. Это даст вам представление о том, что я пытаюсь сделать.

select [name],[salesdate], COUNT(*) as dayTotal, 
SUM(COUNT(*)) over() as AllSales 
FROM [dbo].[sales] 
group by [name], [salesdate] 
+0

Хороший ответ, но почему вы удалили символ #? –

+0

очень хороший ответ, я не знал, что вы могли бы использовать сумму с пробелом (0) – draca

+0

@GreenstoneWalker - таблица не появилась в студии, когда я использовал #. Итак, я удалил его. Возможно, я этого не заметил. –

3

Самый верный ответ кажется неправильным.

ОП имеет ожидаемый ответ

, например, на 1-1-13 Джо продал 3 единицы из 4 Всего за день (75%)

и все же upvoted ответ показывает 60%.

Вместо суммирования по всем данным она должна быть разделена на день, вот лучший пример:

select [name],[salesdate], COUNT(*) as dayTotal, 
SUM(COUNT(*)) over(PARTITION BY salesdate) as AllDaySales, 
(COUNT(*) * 1.0)/SUM(COUNT(*)) over(PARTITION BY salesdate) as dayPercent 
FROM [dbo].[sales] 
group by [name], [salesdate] 
+0

Благодарим вас за улучшенное редактирование! – user107172

0

- Использование Ниже Query

select T1.salesdate, name ,convert(numeric(18,2),convert(decimal,count(*)) * 100/T2.total) as percentage from #sales T1 
    inner join (
    select salesdate,count(*) as total from #sales group by salesdate 
    ) as T2 
    on T1.salesdate = T2.salesdate 
    group by name,T1.salesdate,T2.total 
+1

Благодарим вас за этот фрагмент кода, который может предоставить ограниченную немедленную помощь. [Правильное объяснение значительно улучшит его долгосрочную ценность] (// meta.stackexchange.com/q/114762/206345), показывая _why_, это хорошее решение проблемы и сделает его более полезным для будущих читателей с другие, подобные вопросы. Пожалуйста, отредактируйте свой ответ, чтобы добавить какое-то объяснение, включая сделанные вами предположения. – Machavity

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