Подзапросы в «Выбрать» или «Упорядочить по» не поддерживаются, если подзапрос не является частью «Группировать по» - PullRequest
0 голосов
/ 27 июня 2019

новичок в SQL, я пытаюсь использовать подзапрос, чтобы получить «% выполнения» столбца, но в заголовке появляется ошибка.

Структура моей таблицы выглядит следующим образом:

col_name, value1
a           6
b           5
c           4
d           3
e           2
f           1

Мне нужно добавить% Total & cumulative%, чтобы оно выглядело как:

col_name, value1, % Total  , cumulative %
a           6        28.5%     28.5%
b           5        23.8%     52.3%
c           4        19.04%    71.2%
d           3        14.28%    84.5%
e           2         9.5%     94%  
f           1         4.7%     100% 

Не могли бы высовет, как это сделать с помощью подзапроса?

Попробовал следующий код в другой таблице:

select a, sum(b), 
(select sum(b) from t1 where a <= t1.a) as running_total
from
t1 
group by 1
order by 3 

Мне нужно добавить% Total & cumulative%, чтобы он выглядел так:

col_name, value1, % Total  , cumulative %
a           6        28.5%     28.5%
b           5        23.8%     52.3%
c           4        19.04%    71.2%
d           3        14.28%    84.5%
e           2         9.5%     94%  
f           1         4.7%     100% 

моглапожалуйста, посоветуйте, как это сделать с помощью подзапроса?

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Используйте оконные функции!

select a, sum(b),
       sum(b) / sum(sum(b)) over () as ratio,
       sum(sum(b)) over (order by sum(b) desc) / sum(sum(b)) over () as running_ratio
from t1 
group by a
order by 3 
0 голосов
/ 29 июня 2019

@ Гордон - это, вероятно, первый случай, когда я не могу заставить ваш код работать - поэтому я пытаюсь разместить свое решение - и я не могу избежать вложенного запроса - как вы, @WUB, уже догадались.

Использование именно ваших входных данных в начальном предложении WITH ...

WITH
-- this is your input, start your "real" WITH clause later
input(col_name,value1) AS (
          SELECT 'a',6
UNION ALL SELECT 'b',5
UNION ALL SELECT 'c',4
UNION ALL SELECT 'd',3
UNION ALL SELECT 'e',2
UNION ALL SELECT 'f',1
)
-- end of your input, start "real" WITH clause after this, with 
-- "WITH" instead of comma on the next line
,
input_w_rtr AS (
SELECT
  col_name
, value1
, (value1 * 100 / SUM(value1) OVER())::NUMERIC(4,2) AS ratio_to_report
FROM input
)
SELECT
  col_name
, value1
, ratio_to_report
, SUM(ratio_to_report) OVER(ORDER BY col_name) AS running_ratio_to_report
FROM input_w_rtr;
-- out  col_name | value1 | ratio_to_report | running_ratio_to_report 
-- out ----------+--------+-----------------+-------------------------
-- out  a        |      6 |           28.57 |                   28.57
-- out  b        |      5 |           23.81 |                   52.38
-- out  c        |      4 |           19.05 |                   71.43
-- out  d        |      3 |           14.29 |                   85.72
-- out  e        |      2 |            9.52 |                   95.24
-- out  f        |      1 |            4.76 |                  100.00
-- out (6 rows)
-- out 
-- out Time: First fetch (6 rows): 11.422 ms. All rows formatted: 11.465 ms
...