Выберите несколько строк или пустую строку, если совпадений не существует - PullRequest
0 голосов
/ 04 октября 2019

У меня есть три таблицы. Ссылка "Люди, активность и активность"

Я пытаюсь перечислить всех людей и их распределение для действия "a3" в течение указанной даты. Многократные распределения должны быть перечислены. Люди без распределения должны быть указаны как Null , но активность должна быть указана.

Условия:

- Дата: 04.10.10 2019 должно быть между началом и концом.

- Где people_id! = P4

-SQL Server или эквивалентный trans-sql, mysql и т. Д.

Таблица людей:

+-----------+
| people_id |
+-----------+
| p1        |
| p2        |
| p3        |
| p4        |
| p5        |
+-----------+

Таблица активности:

+------------------+-----------+
| activity_type_id |   name    |
+------------------+-----------+
| a1               | monday    |
| a2               | tuesday   |
| a3               | wednesday |
| a4               | thursday  |
| a5               | friday    |
+------------------+-----------+
* 1024Таблица активности:
+-------------------------+--------+----------+------------+------------+
| activity_people_link_id | people | activity |   start    |    end     |
+-------------------------+--------+----------+------------+------------+
|                       1 | p1     | a1       | 03/10/2019 | 10/10/2019 |
|                       2 | p1     | a3       | 02/10/2019 | 10/10/2019 |
|                       3 | p2     | a4       | 02/10/2019 | 10/10/2019 |
|                       4 | p2     | a2       | 01/10/2019 | 01/12/2019 |
|                       5 | p3     | a3       | 01/06/2019 | 01/07/2019 |
|                       5 | p4     | a3       | 01/01/2019 | 20/12/2020 |
|                       6 | p5     | a3       | 01/01/2017 | 20/12/2020 |
|                       7 | p5     | a3       | 20/03/2017 | 20/10/2019 |
+-------------------------+--------+----------+------------+------------+

Результаты:

+-----------+----------+------------+------------+
| people_id | activity |   start    |    end     |
+-----------+----------+------------+------------+
| p1        | a3       | 02/10/2019 | 10/10/2019 |
| p2        | a3       | null       | null       |
| p3        | a3       | null       | null       |
| p5        | a3       | 01/01/2017 | 20/12/2020 |
| p5        | a3       | 20/03/2017 | 20/10/2019 |
+-----------+----------+------------+------------+

Ответы [ 3 ]

1 голос
/ 04 октября 2019
SELECT
   pa.people_id,
   pa.activity_type_id,
   al.[start],
   al.[end]
FROM
(
   SELECT
      p.people_id,
      a.activity_type_id
   FROM
      people p, activity a
   WHERE
      p.people_id <> 'p4'
      AND a.activity_type_id = 'a3'
) pa
LEFT JOIN activity_link al ON al.people = pa.people_id AND al.activity = pa.activity_type_id AND al.[start] <= CAST('2019-10-04' AS date) AND al.[end] >= CAST('2019-10-04' AS date)
WHERE
   (al.[start] IS NOT NULL AND al.[end] IS NOT NULL)
   OR al.[start] IS NULL
   OR al.[end] IS NULL
0 голосов
/ 04 октября 2019

, если вы не хотите видеть нулевую ссылку. Вы можете использовать NVL(start,0) для нулевой ссылки

0 голосов
/ 04 октября 2019

Вы можете попробовать использовать левое соединение

select a.people_id,activity,start,ednd from peopletable a 
left join ActivityLink b on a.people_id=b.people_id 
               and '04/10/2019'>=start and '04/10/2019'<=end and activity='a3'
where a.people_id!='p4'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...