Как мне сохранить результаты нескольких операторов case в разных столбцах (которых нет в исходной таблице)?

#sql #postgresql

#sql #postgresql

Вопрос:

Я пытаюсь запросить таблицу, которая имеет (user_id, segmentd_id, date), чтобы создать новую таблицу, подобную этой: введите описание изображения здесь

итак, я думал о чем-то подобном, но это не работает:

 WITH Temp_seg as
SELECT
user_id, 
Segment1,
Segment2,
Segment3,
Segment4,
Segment5,
Segment6,
Segment7,
Segment8,
Segment9,
Segment10


(select 
user_id,
(case when segment_id in (1) then "Yes" else empty end) Segment1,
(case when segment_id in (2) then "Yes" else empty end) Segment2,
(case when segment_id in (3) then "Yes" else empty end) Segment3,
(case when segment_id in (4) then "Yes" else empty end) Segment4,
(case when segment_id in (5) then "Yes" else empty end) Segment5,
(case when segment_id in (6) then "Yes" else empty end) Segment6,
(case when segment_id in (7) then "Yes" else empty end) Segment7,
(case when segment_id in (8) then "Yes" else empty end) Segment8,
(case when segment_id in (9) then "Yes" else empty end) Segment9,
(case when segment_id in (10) then "Yes" else empty end) Segment10,

from Segments 
where date = last_7_days
and segment_id in (1,2,3,4,5,6,7,8,9,10)
group by user_id
  

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

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

1. Я удалил несовместимые теги базы данных. Пожалуйста, помечайте только ту базу данных, которую вы действительно используете. Четкое объяснение логики также помогло бы.

2. Я использую postgresql, логика заключается в том, что в segment_id будут значения от 1 до 10, мне нужна новая таблица с идентификатором пользователя, где для каждого пользователя я отмечаю «да» в каждом столбце, к которому они принадлежат. имеет ли это смысл?

Ответ №1:

Я не уверен, что это то, что вам нужно:

 select user_id
       , max(case when segmentd_id = 1 then 'Yes' end) Segment1
       , max(case when segmentd_id = 2 then 'Yes' end) Segment2
       , max(case when segmentd_id = 3 then 'Yes' end) Segment3
from segments
group by user_id
order by user_id
  

Вот демонстрация:

ДЕМОНСТРАЦИЯ

Если вам нужно будет добавить where caluse для заполнения данных только за последние 7 дней, вы можете использовать это:

 select user_id
       , max(case when segmentd_id = 1 then 'Yes' end) Segment1
       , max(case when segmentd_id = 2 then 'Yes' end) Segment2
       , max(case when segmentd_id = 3 then 'Yes' end) Segment3
from segments
where date_c >= CURRENT_DATE -7
group by user_id
order by user_id
  

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

1. Спасибо именно то, что я искал!!