Использовать столбец с именем «AS» в следующем определении столбца - PullRequest
0 голосов
/ 16 апреля 2020

Как бы я использовал столбец, который я определил как «total_affered», вместо длинной функции? .. Я чувствую, что есть лучший способ сделать это, чем повторять то же самое из предыдущей строки. Я не уверен, как определить это, чтобы я мог использовать его сразу после в следующем столбце.

SELECT c.name,
       COALESCE(sum(country_status_count.cured), 0) as cured,
       COALESCE(sum(country_status_count.dead), 0) as dead,
       cic.infected,
       SUM(COALESCE(cured, 0) + COALESCE(dead, 0) + infected) AS total_affected,
       (total_affected / c.population) as rate_of_infection <-- Something like this line instead of copying the whole function from the line above


FROM country_status_count

RIGHT JOIN country c ON country_status_count.country_id = c.id
RIGHT JOIN country_infection_counts cic ON c.name = cic.name

GROUP BY c.name, cic.infected, c.population
ORDER BY c.name ASC;

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Добавьте столбец c.population в предложении GROUP BY и повторно используйте SUM(COALESCE(cured, 0) + COALESCE(dead, 0) + infected) для расчета, поскольку вы не можете использовать производный столбец total_affected:

SELECT c.name,
       COALESCE(sum(country_status_count.cured), 0) as cured,
       COALESCE(sum(country_status_count.dead), 0) as dead,
       cic.infected,
       SUM(COALESCE(cured, 0) + COALESCE(dead, 0) + infected) AS total_affected,
       (SUM(COALESCE(cured, 0) + COALESCE(dead, 0) + infected) / c.population) as rate_of_infection 
FROM country_status_count
RIGHT JOIN country c ON country_status_count.country_id = c.id
RIGHT JOIN country_infection_counts cic ON c.name = cic.name
GROUP BY c.name, c.population, cic.infected
ORDER BY c.name ASC;
1 голос
/ 16 апреля 2020

Вам нужно использовать либо CTE для установки набора данных перед применением деления, либо дублировать предложение SUM() в делении.

WITH dataset AS
(
    SELECT c.name
         , COALESCE(sum(country_status_count.cured), 0) as cured
         , COALESCE(sum(country_status_count.dead), 0) as dead
         , cic.infected
         , SUM(COALESCE(cured, 0) + COALESCE(dead, 0) + infected) AS total_affected
         , c.population
      FROM country_status_count
     RIGHT JOIN country c ON country_status_count.country_id = c.id
     RIGHT JOIN country_infection_counts cic ON c.name = cic.name
     GROUP BY c.name, cic.infected
     ORDER BY c.name ASC;
)
SELECT *
     , (total_affected / population) as rate_of_infection <-- Something like this line
  FROM dataset
;

Или:

SELECT c.name
     , COALESCE(sum(country_status_count.cured), 0) as cured
     , COALESCE(sum(country_status_count.dead), 0) as dead
     , cic.infected
     , SUM(COALESCE(cured, 0) + COALESCE(dead, 0) + infected) AS total_affected
     , (SUM(COALESCE(cured, 0) + COALESCE(dead, 0) + infected)/ c.population) as rate_of_infection
  FROM country_status_count
 RIGHT JOIN country c ON country_status_count.country_id = c.id
 RIGHT JOIN country_infection_counts cic ON c.name = cic.name
 GROUP BY c.name, cic.infected, c.population
 ORDER BY c.name ASC
;
...