Как построить SQL-запрос с различной агрегацией - PullRequest
1 голос
/ 09 марта 2011

У меня есть следующие данные:

 Date   ID Type Cost
 May 01   a  A    1
 May 01   b  A    2
 May 01   c  B    3
 May 01   d  B    4
 May 02   e  A    5
 May 02   f  A    6
 May 02   g  B    7
 May 02   h  B    8

Я хочу запрос, который показывает

Date       Type CostPercentage
May 01    A    (1+2) / (1+2+3+4)
May 01    B    (3+4) / (1+2+3+4)
May 02    A    (5+6) / (5+6+7+8)
May 02    B    (7+8) / (5+6+7+8)

Что у меня сейчас есть

select Date, Type, sum(cost)
from mytable
group by Date, Type

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

Как мне это сделать?

отредактировано, чтобы отразить мою настоящую проблему. Я слишком упростил это раньше.

Ответы [ 3 ]

1 голос
/ 09 марта 2011

Этот запрос должен работать по желанию, "o" - внешняя таблица, "i" - внутренняя таблица:

select  o.date,
        o.type,
        sum(o.cost) / (select sum(i.cost) from mytable as i where i.date=o.date) * 100.0
    from    mytable as o
    group by 
            o.date,o.type

Для этого примера данных:

Day1, A, 1
Day2, A, 2
Day1, B, 3
Day2, B, 4

результаты:

  • Расходы типа А составили 25% Общие расходы на 1 день (1/1 + 3).
  • Тип Б расходы составили 75% от первого дня общие расходы (3/1 + 3).
  • Тип A стоит составило ~ 33% от общего дня 2 затраты (2/2 + 4).
  • Расходы типа B составили на ~ 66% от общей стоимости дня2 (4 / 2 + 4).
1 голос
/ 09 марта 2011

Вы можете использовать подзапрос:

select  dt.Date
,       dt.Type
,       SUM(dt.Cost) as DayTypeTotal
,       (select SUM(Cost) from @t d where d.Date = dt.Date) as DayTotal
,       100.0 * SUM(dt.Cost) / 
             (select SUM(Cost) from @t d where d.Date = dt.Date) as Percentage
from    @t dt
group by
        dt.Date
,       dt.Type

Ссылка на рабочий пример @ odata .

0 голосов
/ 09 марта 2011
select 
  mytable.date, mytable.type, sum(mytable.cost)/day.total_cost
from mytable
inner join
(select date, sum(cost) as total_cost from mytable group by date) as day
on day.date=mytable.date
group by mytable.date, mytable.type
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...