получить соотношение по нескольким строкам по заданному идентификатору - PullRequest
0 голосов
/ 25 октября 2018

У меня есть (тестовая) таблица:

  zip  | category | value 
-------+----------+-------
 17268 |        1 |    23
 17268 |        2 |    10
 17268 |        3 |    33
 10011 |        1 |    22
 10011 |        2 |    78
 10011 |        3 |    45

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

Например, общее значение для почтового индекса 17268 равно 66. И для этой категории почтового индекса 3 значения равны 33. Поэтому я хочу присвоить 17268 значение коэффициента вывода .5 (для 33/66).

Iможет выполнить эту команду:

select zip, sum(distinct value) from ziptest group by zip;

Чтобы получить это преобразование:

  zip  | sum 
-------+-----
 10011 | 145
 17268 |  66

Но теперь я хочу разделить эту сумму для каждого почтового индекса на значение значения категории 3 этого почтового индекса.

Кто-нибудь может посоветовать?

Я подозреваю, что ищу что-то вроде этого:

select zip, (select value from ziptest where category = 3)/sum(distinct value) from ziptest group by zip;

или это:

select zip, sum(distinct value), (value where category = 3) from ziptest group by zip;

1 Ответ

0 голосов
/ 25 октября 2018

Коррелированный подзапрос - хороший маршрут здесь.Это похоже на вашу первую попытку, но с «Корреляцией» между основным запросом и подзапросом:

select zip, (select value from ziptest where category = 3 and zip = zt.zip)/sum(distinct value) 
from ziptest zt 
group by zip;

Альтернативно с использованием объединения:

 select zt.zip, zt2.cat3value/sum(value)
 from ziptest zt
     INNER JOIN (SELECT DISTINCT zip, value FROM ziptest WHERE category=3) zt2
         ON zt.zip = zt2.zip
 group by zip;

Альтернативно (и, вероятно, быстрее)использует регистр:

 SELECT zip, sum(CASE WHEN category=3 THEN value ELSE 0 END)/Sum(value)
 FROM ziptest
 GROUP BY zip;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...