Невозможно выбрать отдельные значения для объединений - PullRequest
1 голос
/ 23 октября 2019

Нужно объединить разные таблицы, но во время объединения, чтобы выбрать отдельные строки для одного столбца

У меня есть следующие таблицы:

Devices
-------
id
Device
Snid
locationid
planid

Locations
---------
id
location

Plans
------
id
plan

Assignments
-----------
id
deviceid
startdate
enddate

Я попробовал вот что:

SELECT DISTINCT a.id, a.device, a.Snid, b.location, c.plan, d.startdate, d.enddate 
FROM Devices a 
LEFT JOIN Locations b on a.locationid=b.id 
LEFT JOIN Plans c on a.planid=c.id 
LEFT JOIN Assignments d on a.id=deviceid

Если в select я удаляю столбцы назначения (startdate, enddate), то получаю нормальные результаты, но мне нужно получить столбцы таблицы Assignment. Но, как только я добавляю столбцы, я не могу получить различные устройства.

В результате я хотел бы получить таблицу устройств с комбинацией планов и местоположений (для имени плана и местоположения), а также столбцов начальной и конечной даты назначения. И иметь уникальные устройства с последним назначением, которое в mycase должно быть с пустым столбцом конечной даты.

Кроме того, мне нужно получить столбец totalassignments. Я попытался добавить в выделенную часть:

SUM(case when a.id=d.deviceid then 1 else 0) as totalassignments

, но если я использую это, мне нужно добавить группу по. В группе по, мне нужно включить все столбцы, а затем я снова теряю свою личность.

Пример следующим образом:

Таблица устройств

id  device  locationid  planid
2   computer    1         0
3   mobile      2         1
10  printer     1         1
12  scanner     1         1
32  tablet      1         1
42  tv          2         2
68  video       3         2
98  camera      0         0

Таблица расположений

ID  location
1   Storage
2   Office
3   Contractor

Таблица планов

ID  Plan
1   Short-term
2   Long-term

Таблица назначений

id  deviceid    startdate   enddate
1      10      10/17/2019   2/23/2019
2      32      10/20/2019   
3      12      10/18/2019   11/1/2019
4      68       
5      98      10/15/2019   10/5/2019
6      42      10/23/2019   
7      10      10/1/2019      NULL
8       2      8/18/2019    10/21/2019
9       3      10/23/2020    NULL
10     12      10/2/2019     NULL

Желаемый результат

device  deviceid    location    plan    totalassignments    startdate   enddate
computer    2       Storage     NULL          1             8/18/2019 10/21/2019
mobile      3       Office    Short-term      1             10/23/2020  NULL
printer     10      Storage   Short-term      2             10/1/2019   NULL
scanner     12      Storage   Short-term      2             10/2/2019   NULL
tablet      32      Storage   Short-term      1             10/20/2019  
tv          42      Office    Long-term       1             10/23/2019  
video       68      ContractorLong-term       1                NULL     NULL
camera      98      NULL        NULL          1             10/15/2019  

Как видите, результат должен иметь устройства (с замененным locationid и planid с соответствующими именами местоположения и плана с использованием внутреннего соединения), для каждого устройства должно быть количество назначений, а рядом с ним - дата начала и окончания последнего назначения (которое настраивается, когда конечной датой является NULL)

1 Ответ

1 голос
/ 23 октября 2019

Это связано с тем, что фактор времени в данных вашего столбца не совпадает.

CAST(d.startdate AS DATE) приведет к аннулированию элемента времени, сохранив только дату

Попробуйте это

SELECT DISTINCT a.id, a.device, a.Snid, b.location, c.plan, 
       CAST(d.startdate AS DATE), CAST(d.enddate AS DATE)
FROM Devices a LEFT JOIN Locations b on a.locationid=b.id 
LEFT JOIN Plans c on a.planid=c.id LEFT JOIN Assignments d on a.id=deviceid

Если вы хотите включить функцию агрегирования,

SELECT DISTINCT a.id, a.device, a.Snid, b.location, c.plan, 
       CAST(d.startdate AS DATE), CAST(d.enddate AS DATE),
       SUM(case when a.id=d.deviceid then 1 else 0) as totalassignments
FROM Devices a LEFT JOIN Locations b on a.locationid=b.id 
LEFT JOIN Plans c on a.planid=c.id LEFT JOIN Assignments d on a.id=deviceid
GROUP BY a.id, a.device, a.Snid, b.location, c.plan, 
       CAST(d.startdate AS DATE), CAST(d.enddate AS DATE)
...