Как мне объединить результаты 3 запросов в одну таблицу

#sql #postgresql #join #union

#sql #postgresql #Присоединиться #объединение

Вопрос:

У меня есть 3 запроса, которые выдают одинаковый стиль результата. Каждый запрос следует одной и той же структуре.

Таблицы, используемые в запросе:

  • registration_database:

содержит уникальные идентификационные номера для людей, которые зарегистрировались для участия в опросе, которые ранее не были зарегистрированы для участия в опросе [столбец: регистрация] (объединяется с statefileid)

  • statefileid:

содержит уникальные идентификационные номера для большой группы людей, которые [столбец: ‘statefileid’] и имеют информацию об их любимом цвете [столбец: ‘favcolor’]

  • 2016data:

содержит значения statefileid для всех, кто принимал участие в опросе в 2016 году. Имеет [столбец: электронный], который указывает, принимал ли человек участие в опросе в электронном виде «Y» или лично «N» (по логике все, кто не принимал участие в опросе в электронном виде, должны были принять участие в опросе лично

  • 2018data:

то же, что и в 2016data, за исключением того, что в нем содержится информация обо всех, кто принимал участие в опросе в 2018 году

  • 2020data:

то же, что и 2020data, за исключением того, что в нем содержится информация обо всех, кто принимал участие в опросе в 2020 году

public_scores_2020: содержит столбец statefileid для присоединения к другим таблицам и [column: lrsupport], который дает прогнозную оценку от 1 до 100, независимо от того, поддерживают ли они направление влево (100) или поддерживают направление вправо (1)

Запрос 1:

 select
case when favcolor='r' then 'Red'
               when favcolor='b' then 'Blue'
               when favcolor='g' then 'Green'
               when favcolor='y' then 'Yellow'
               when favcolor='o' then 'Orange'
               when favcolor='u' then 'Unknown Fav Color'
               when favcolor='w' then 'White'
               else 'Unknown Fav Color' end as "Favorite_Color"
,round(sum((lrsupport)/100),0) as "left"
,round(sum((1-(lrsupport)/100)),0) as "right"
,count(registration) AS "new_registered"
FROM registration_database
left join
statefileid
on registration=statefileid
join 2016data AS a
using (statefileid)
left join public_scores_2020
using(statefileid)
where a.electronic = 'N'
group by 1
order by 1
  

Запрос 2:

 select
case when favcolor='r' then 'Red'
               when favcolor='b' then 'Blue'
               when favcolor='g' then 'green'
               when favcolor='y' then 'yellow'
               when favcolor='o' then 'orange'
               when favcolor='u' then 'Unknown Fav Color'
               when favcolor='w' then 'White'
               else 'Unknown Fav Color' end as "Favorite_Color"
,round(sum((lrsupport)/100),0) as "left"
,round(sum((1-(lrsupport)/100)),0) as "right"
,count(registration) AS "new_registered"
FROM registration_database
left join
statefileid
on registration=statefileid
join 2018data AS a
using (statefileid)
left join public_scores_2020
using(statefileid)
where a.electronic = 'N'
group by 1
order by 1
  

Запрос 3:

 select
case when favcolor='r' then 'Red'
               when favcolor='b' then 'Blue'
               when favcolor='g' then 'green'
               when favcolor='y' then 'yellow'
               when favcolor='o' then 'orange'
               when favcolor='u' then 'Unknown Fav Color'
               when favcolor='w' then 'White'
               else 'Unknown Fav Color' end as "Favorite_Color"
,round(sum((lrsupport)/100),0) as "left"
,round(sum((1-(lrsupport)/100)),0) as "right"
,count(registration) AS "new_registered"
FROM registration_database
left join
statefileid
on registration=statefileid
join 2020data AS a
using (statefileid)
left join public_scores_2020
using(statefileid)
where a.electronic = 'N'
group by 1
order by 1
  

Вывод для каждого запроса таблицы выглядит следующим образом, это для запроса, который ссылается на 2016data
Вывод для каждого запроса таблицы выглядит следующим образом, это для запроса, который ссылается на 2016data

Я пытаюсь объединить выходные данные 3 запросов, чтобы я все еще мог получать результаты, упорядоченные по строкам любимого цвета = красный, синий, зеленый и т.д. с 9 столбцами: 2016left, 2016right, 2016new_registered, 2018left, 2018right, 2018new_registered,2020left, 2020right, 2020new_registered.

Может ли кто-нибудь помочь мне с этим?

Комментарии:

1. не могли бы вы использовать это — пожалуйста, замените qry2016, используя ваш query1 и так далее. select q1.Favorite_Color, q1.left 2016left, q1.right 2016right,q1.new_registered 2016new_registered q2.left 2018left, q2.right 2018right,q2.new_registered 2018new_registered q3.left 2020left, q3.right 2020right,q3.new_registered 2020new_registered from qry2016 q1 left join qry2018 q2 on q2.Favorite_Color=q1.Favorite_Color left join qry2020 q3 on q3.Favorite_Color=q1.Favorite_Color order by 1

2. Первое, что вы должны сделать, чтобы действительно исправить это, это не иметь несколько таблиц для одного и того же объекта. В таблице должна быть только таблица data с дополнительным столбцом за год.

3. И в дополнение к тому, что сказал бит sticky, используйте sum и count с filter (where year = 20xx) предложением для агрегированных столбцов.

4. @stickybit к сожалению, у меня нет разрешения на создание новой таблицы, которая объединяет столбцы в 2016data, 2018data и 2020data. У вас есть какие-либо идеи по обходному пути?

5. @NickLal create view years_data as select 2016 as year, * from 2016data union all select 2018 as year, * from 2018data union all select 2020 as year, * from 2020data и так далее, если есть больше лет.

Ответ №1:

Объедините таблицы, которые разделены по годам, используя общие табличные выражения, тогда это уменьшит сложность запроса. Это всего лишь пример, он может не сработать без дополнительных усилий:

 with all_data as (
        select statefileid, lrsupport, electronic, 2016 as Year
        from 2016data
        union all
        select statefileid, lrsupport, electronic, 2018 as Year  
        from 2018data
        union all
        select statefileid, lrsupport, electronic, 2020 as Year
        from 2020data
        )

SELECT
  CASE
               when stf.favcolor='r' then 'Red'
               when stf.favcolor='b' then 'Blue'
               when stf.favcolor='g' then 'green'
               when stf.favcolor='y' then 'yellow'
               when stf.favcolor='o' then 'orange'
               when stf.favcolor='u' then 'Unknown Fav Color'
               when stf.favcolor='w' then 'White'
               else 'Unknown Fav Color'
  end as "Favorite_Color"
, count(case when a.year = 2016 then reg.registration end) AS "new_registered_2016"
, count(case when a.year = 2018 then reg.registration end) AS "new_registered_2018"
, count(case when a.year = 2020 then reg.registration end) AS "new_registered_2020"
FROM registration_database AS reg
INNER JOIN statefileid AS stf ON reg.registration = stf.statefileid
INNER JOIN all_data AS a ON stf.statefileid = a.statefileid
LEFT JOIN public_scores_2020 AS score ON stf.statefileid = score.statefileid
WHERE a.electronic = 'N'
GROUP BY 1
ORDER BY 1
  

Пожалуйста, также используйте имена таблиц или псевдонимы при обращении к столбцам во всем запросе, и я также рекомендую использовать более явные объединения, чтобы помочь в этом. Я думаю, что соединение с таблицей statefileid может быть внутренним соединением