#sql #sql-server
#sql #sql-сервер
Вопрос:
Мой заголовок может сбить с толку, поэтому я постараюсь объяснить как можно лучше.
У меня есть две таблицы
СЛЕВА: таблица numbers
СПРАВА: таблица contracts
:
Я хочу показать, что для каждого экземпляра, где есть number
связанный с контрактом, и он запускается с 9
, чтобы иметь свою собственную строку, изменяя значение accessID
на это число. И если номер начинается с 2
него, это не изменяет accessID
значение, а добавляет его в столбец phone .
Мой код
SELECT CASE WHEN n.number LIKE '9%' THEN n.number ELSE c.accessID END accessID
, c.client client
, '' stat
, '' phone
FROM numbers n
JOIN contracts c ON c.contractID = n.contractID
WHERE n.number LIKE '9%'
UNION
SELECT c.accessID accessID
, c.client client
, c.stat stat
, CASE WHEN n.number LIKE '2%' THEN n.number ELSE '' END phone
FROM contracts c
LEFT JOIN numbers n ON n.contractID = c.contractID
ORDER BY client
В этом случае я хочу скрыть выделенную строку, но если я добавлю WHERE n.number LIKE '2%'
после LEFT JOIN
, это скроет каждую строку, где accessID
не начинается с 9
и не имеет никакого значения phone
.
Я тоже пробовал это, но безуспешно
WHERE EXISTS (SELECT n.number FROM numbers n where n.number like '2%')
Комментарии:
1. Зачем вам нужно
Leon
дважды, если вы не хотитеMary
три раза?2.
Leon
имеет номер, начинающийся с9
, поэтому он будет отображаться дважды, обратите внимание, что вaccessID
столбце значения разные, дляLeon
, но сMary
, есть две строки с одинаковым значением.3. Я всегда хочу показывать по одной строке для каждого, только если у них есть число, начинающееся с
9
, я хочу показать другую строку.4. Пожалуйста, опубликуйте образцы данных в формате DDL amp; DML или форматированного текста, чтобы люди могли скопировать / вставить их для тестирования и получить ответ. Изображения не помогут другим помочь вам.
5. Вы можете использовать эту ссылку на dbfiddle с запросом и настроенными таблицами
Ответ №1:
Это вам нужно?
SELECT CASE WHEN n.number LIKE '9%' THEN n.number ELSE c.accessID END accessID, c.client client, '' stat, '' phone
FROM numbers n
JOIN contracts c ON c.contractID = n.contractID
WHERE n.number LIKE '9%'
UNION
SELECT l.accessID,l.client,l.stat,l.phone FROM (
SELECT c.accessID accessID, c.client client, c.stat stat, CASE WHEN n.number LIKE '2%' THEN n.number ELSE '' END phone
,ROW_NUMBER()OVER(PARTITION BY n.contractID,c.stat ORDER BY n.number) AS LineID
FROM contracts c
LEFT JOIN numbers n ON n.contractID = c.contractID
) AS l WHERE l.LineID=1
ORDER BY client
Идентификатор доступа к статическому телефону клиента
134568792 Джон запланировал 246875183 141574896 Леон установлен 0 967664616 Леон 0 139874521 Мэри отменена 225496825 914568598 Мэри 0 140410591 Тони установлен 0 918264829 Тони 0