Как сравнить несколько записей в нескольких строках для одного и того же идентификатора?

Проблема: я пытаюсь узнать по каждому идентификатору класса, имеет ли сотрудник (empID) хотя бы 1 StateCertArea в FedCertArea, и флаг = 1, если да.

Справочная информация по этому фейковому делу:

  • Все classID имеют FederalCertAreas.
  • У всех сотрудников есть StateCertAreas.
  • Я пытаюсь узнать, есть ли у сотрудника StateCertArea, которая соответствует любой FedCertArea для ClassID.

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

DROP TABLE IF EXISTS #temptable
CREATE TABLE #temptable ( ClassID int, EmpID decimal(10,0), StateCertArea varchar(4), FedCertArea varchar(4))

INSERT INTO #temptable (ClassID, EmpID, StateCertArea, FedCertArea)
VALUES
( 572888, 77777, '228', '228'),
( 572888, 77777, '389', '389'),
( 572888, 77777, '374', '374'),
( 222555, 77777, '333', '999')

SELECT t.ClassID
     , t.EmpID
     , t.StateCertArea
     , t.FedCertArea      
     --, CASE WHEN 'EmployeeID has at least 1 StateCertArea in FedCertArea' THEN 1 ELSE 0 END AS IsInArea    
FROM #temptable AS t

Ожидаемый результат:

например, не могли бы вы показать, какого результата вы ожидаете? вы ищете что-то вроде этого: [добавить оператор выбора в другой столбец] , CASE WHEN t2.StateCertificationArea = t3.FederalCertificationArea THEN 1 ELSE 0 END AS testresunt

Power Mouse 14.09.2023 21:52

Можете ли вы также указать ожидаемый результат, т. е. завершить минимальный воспроизводимый пример .

jarlh 14.09.2023 22:02

выберите случай, когда существует (выберите 1 из некоторой области sa, где sa.areaid = yourtable.areaid), затем 1, иначе 0 закончится как существует,...

siggemannen 15.09.2023 09:46

Я добавил ожидаемый результат и дополнительный код, чтобы показать, что я хотел бы сделать, если идентификатор сотрудника не был сертифицирован в регионе.

JM1 15.09.2023 12:05
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Символ outer apply обеспечивает эффективный способ запуска коррелированных подзапросов, таких как тот, который необходим здесь, например:

DROP TABLE IF EXISTS #temptable
CREATE TABLE #temptable (ClassID int, EmpID decimal(10,0), StateCertArea varchar(4), FedCertArea varchar(4))

INSERT INTO #temptable (ClassID, EmpID, StateCertArea, FedCertArea)
VALUES
( 572888, 77777, '228', '228'),
( 572888, 77777, '389', '389'),
( 572888, 77777, '374', '374'),
( 222555, 77777, '333', '999')

SELECT DISTINCT
       t.ClassID
     , t.EmpID
     , CASE WHEN oa.HasMatchingArea = 1 THEN 1 ELSE 0 END AS IsInArea    
FROM #temptable AS t
OUTER APPLY (
   SELECT TOP(1) 1 AS HasMatchingArea
   FROM #temptable AS t2
   WHERE t2.ClassID = t.ClassID
     AND t2.EmpID = t.EmpID
     AND t2.StateCertArea = t.FedCertArea
) AS oa
ID класса ЭмпИД ИсИнАреа 222555 77777 0 572888 77777 1

рабочий пример

чередуйте использование coalesce

SELECT DISTINCT
       t.ClassID
     , t.EmpID
     , COALESCE(oa.HasMatchingArea,0) AS IsInArea    
FROM #temptable AS t
OUTER APPLY (
   SELECT TOP(1) 1 AS HasMatchingArea
   FROM #temptable AS t2
   WHERE t2.ClassID = t.ClassID
     AND t2.EmpID = t.EmpID
     AND t2.StateCertArea = t.FedCertArea
) AS oa

Это сработало, спасибо!

JM1 22.09.2023 20:55

Мне нужно избегать SELECT в инструкции CASE, если это возможно.

Как насчет CASE в SELECT?

SELECT ClassID, EmpID, MAX(CASE WHEN StateCertArea = FedCertArea THEN 1 ELSE 0 END) IsInArea
FROM #temptable
GROUP BY ClassID, EmpID

Это называется условной агрегацией. Обычно я работаю нормально, и, по крайней мере, работает с образцами данных:

https://dbfiddle.uk/y5CKgHgJ

... хотя неясно, что вы хотите, если у вас есть эти строки:

ID класса ЭмпИД Статесертареа FedCertArea 432818 77777 228 114 432818 77777 114 366

Приведенный выше SQL присвоит столбцу IsInArea значение 0, но возможно, вам понадобится здесь 1.

Другие вопросы по теме

Есть ли способ перенести значение ProcessDate в первую таблицу на основе совокупного итога столбца в другой таблице?
Частота значения в таблице
Отметьте условие «Не» в двух столбцах
Запрос занимает 10 минут при использовании табличных переменных по сравнению с 2 секундами при использовании временной таблицы
Невозможно разрешить конфликт параметров сортировки между «Polish_CI_AS» и «SQL_Latin1_General_CP1_CI_AS» в операторе CASE, возникающем в инструкции SELECT
Если табличные переменные имеют область действия только своего пакета, то почему я могу выбрать одну из них после использования GO?
Как сохранить несколько строк таблицы в разных переменных с помощью хранимой процедуры
Вызов хранимой процедуры со строковым выходным параметром
Попытка подсчитать последовательные значения для пользователя в медленно меняющейся таблице измерений, если последняя запись имеет определенное значение
Безопасность на уровне строк SQL Server с условием

Похожие вопросы

Как разделить столбец с разделителями каналов на новые столбцы в hive sql?
Как я могу определить для каждого года с 2017 по 2020 год, в какой день недели проводилось максимальное количество мероприятий в месяц?
Есть ли способ перенести значение ProcessDate в первую таблицу на основе совокупного итога столбца в другой таблице?
Clickhouse создает столбцы на основе значений других строк
Частота значения в таблице
Отметьте условие «Не» в двух столбцах
Запрос занимает 10 минут при использовании табличных переменных по сравнению с 2 секундами при использовании временной таблицы
Невозможно разрешить конфликт параметров сортировки между «Polish_CI_AS» и «SQL_Latin1_General_CP1_CI_AS» в операторе CASE, возникающем в инструкции SELECT
POSTGRES: Как вычислить возраст по dob в БД, которая позволяет использовать только операторы выбора (без манипуляций с данными)
Разделить значения, разделенные запятыми, на строки с другими столбцами в Oracle