Я пишу отчет, чтобы показать просроченные счета, и я хочу, чтобы он включал платежный адрес компании.Данные имеют несколько типов адресов в качестве возможностей (счет-фактура, бизнес-адрес, роялти-фактура и т. Д.).Все они сопоставлены с идентификатором (address_name_type_id ... 1 - «Бизнес-адрес», 4 - «Билл»).
У каждой организации есть бизнес-адрес. Но я хочу, чтобы этот адрес отображался только в том случае, если другиене существует. Этот код правильно показывает мне адреса, которые я в первую очередь хочу (где идентификатор 4, 5 или 6). Но он загружается пустым для тех, которые имеют только «бизнес-адрес» (потому что это не 4,5 или 6).
ПРИМЕЧАНИЕ: это всего лишь фрагмент соответствующего кода. Весь отчет имеет большой объем, но у меня он настроен на отображение только одной строки на один счет-фактуру. В этом случае organization_id =6303 вообще не отображается, поскольку у него есть только служебный адрес.
SELECT
o.name AS 'Organization',
org_add.address_name_type_id AS "Address Type|display_name:AddressNameType",
ad.street1 AS "Address 1",
ad.street2 AS "Address 2",
ad.city AS "City",
ad.state_id AS "State|display_name:State",
ad.zip_code AS "Zip Code",
ad.country_id AS "Country|display_name:Country"
FROM
organization o
LEFT JOIN
(SELECT o2a.organization_id, o2a.address_name, o2a.address_name_type_id, o2a.address_id, o2a.active
FROM organization2address o2a
WHERE o2a.address_name_type_id IN (4,5,6)) AS org_add ON org_add.organization_id = o.organization_id
LEFT JOIN
address ad ON org_add.address_id = ad.address_id
WHERE o.organization_id IN (6654, 6082, 6303)
AND
org_add.active = 1
Все, что я пытался исправить, в итоге возвращает ТОЛЬКО рабочий адрес, поскольку в каждом счете есть один из них.
Как я могу сказать, чтобы ТОЛЬКО возвращался бизнес-адрес, ЕСЛИ НЕ существует IN_ address_type_type_id (4, 5, 6)? Этот оператор CASE не работает - он только возвращает адрес с address_name_type_id из 1.
SELECT
o.name AS 'Organization',
(CASE WHEN o2a.address_name_type_id = 4 THEN 4
WHEN o2a.address_name_type_id = 5 THEN 5
WHEN o2a.address_name_type_id = 6 THEN 6
ELSE 1
END) AS "Address Type 2|display_name:AddressNameType",
ad.street1 AS "Address 1",
ad.street2 AS "Address 2",
ad.city AS "City",
ad.state_id AS "State|display_name:State",
ad.zip_code AS "Zip Code",
ad.country_id AS "Country|display_name:Country"
FROM
organization o
LEFT JOIN
organization2address o2a ON o2a.organization_id = o.organization_id
LEFT JOIN
address ad ON o2a.address_id = ad.address_id
WHERE o.organization_id IN (6654, 6082, 6303)
AND
o2a.active = 1
group by o.name
Возможно ли это сделать?Я обдумываю это?