Eswar Chandra Vidya Sagar S Ответов: 1

Нужна помощь по запросу T-SQL (MSSQL)


Здравствуйте Эксперты,

У меня есть исходные данные, которые несколько похожи на приведенную ниже таблицу..

Статус MachineName ComplianceCheckItem
M1 C1 Pass
М1 С2-Пасс
М1 С3 Не
М1 С4 Пройти
М2 С3-Пасс
М2 С4 Пройти
Сдать М3 С1
М3 С3 Не
М3 С5-Пасс

Есть 5 пунктов проверки соответствия, для которых мне нужно иметь статус каждой машины. Источник может иметь или не иметь данные, соответствующие этой комбинации элементов проверки соответствия машины + соответствия. Для всех элементов проверки соответствия, которые недоступны в источнике, я хочу показать его как "N/A". Выходные данные должны быть такими, как показано ниже..

Статус MachineName ComplianceCheckItem
M1 C1 Pass
М1 С2-Пасс
М1 С3 Не
М1 С4 Пройти
M1 C5 N/A
M2 C1 N/A
M2 C2 N/A
М2 С3-Пасс
М2 С4 Пройти
M2 C5 N/A
Сдать М3 С1
M3 C2 N/A
М3 С3 Не
M3 C4 N/A
М3 С5-Пасс
Ниже приведен основной список элементов ComplianceCheckItems

ComplianceCheckItem
С1
С2
С3
С4
С5

Что я уже пробовал:

Попытался получить отчетливое имя машины, а затем перекрестное соединение с отчетливым ComplianceCheckItem
но поскольку данные огромны, я думаю, что это не оптимальное решение..

1 Ответов

Рейтинг:
1

Maciej Los

Я не уверен, что хорошо тебя понимаю, но, похоже, ты хочешь этого. перекрестное соединение[^] данные, которые означают, что вы хотите получить всю комбинацию MachineName и ComplianceCheckItem. Проверьте приведенный ниже пример:

DECLARE @master TABLE (MachineName VARCHAR(50), ComplianceCheckItem VARCHAR(50), [Status] VARCHAR(50))

INSERT INTO @master (MachineName, ComplianceCheckItem, [Status])
VALUES('M1', 'C1', 'Pass'),
('M1', 'C2', 'Pass'),
('M1', 'C3', 'Fail'),
('M1', 'C4', 'Pass'),
('M2', 'C3', 'Pass'),
('M2', 'C4', 'Pass'),
('M3', 'C1', 'Pass'),
('M3', 'C3', 'Fail'),
('M3', 'C5', 'Pass')


DECLARE @cci TABLE (ComplianceCheckItem VARCHAR(50))
INSERT INTO @cci(ComplianceCheckItem)
VALUES('C1'), ('C2'), ('C3'), ('C4'), ('C5')

SELECT t.MachineName, t.ComplianceCheckItem, COALESCE(ma.[Status] , 'NA') AS [Status]
FROM (
	SELECT DISTINCT m.MachineName, c.ComplianceCheckItem 
	FROM @master AS m , @cci AS c
	) AS t LEFT JOIN @master AS ma ON t.MachineName = ma.MachineName AND t.ComplianceCheckItem = ma.ComplianceCheckItem 


Результат (как и ожидалось):
MachineName	ComplianceCheckItem	Status
M1			C1					Pass
M1			C2					Pass
M1			C3					Fail
M1			C4					Pass
M1			C5					NA
M2			C1					NA
M2			C2					NA
M2			C3					Pass
M2			C4					Pass
M2			C5					NA
M3			C1					Pass
M3			C2					NA
M3			C3					Fail
M3			C4					NA
M3			C5					Pass


Для получения более подробной информации, пожалуйста, смотрите:
Визуальное представление SQL-соединений[^]
Использование Перекрестных Соединений[^]
COALESCE (Transact-SQL)[^]