Выражения регистра могут быть вложены только до уровня 10 Iif

#sql-server #tsql

#sql-сервер #tsql

Вопрос:

Я столкнулся с проблемой, когда я пытаюсь создать столбец с использованием имени, но у меня больше 20 потоков, но я могу указать только 10 здесь мой запрос:

 select Missions, Sum(Morning) Morning, Sum(PM) PM, Sum(Night) Night, count(*) Total from [dbo].[VIEW_JOBS_FINISHED_ALL] cross apply (values (Iif(QUELLE in ('Réception_14','Réception_21'),'M1',  Iif(QUELLE in ('Réception_17','Réception_16'),'M2',  Iif(QUELLE in ('Réception_13','Réception_19'),'M3',  Iif(QUELLE in ('Réception_15','Réception_25'),'M4',  Iif(QUELLE in ('Réception_15','Réception_25'),'M5',  Iif(QUELLE in ('Réception_15','Réception_25'),'M6',  Iif(QUELLE in ('Réception_15','Réception_25'),'M7',  Iif(QUELLE in ('Réception_15','Réception_25'),'M8',  Iif(QUELLE in ('Réception_15','Réception_25'),'M9',  Iif(QUELLE in ('Réception_15','Réception_25'),'M10',  Iif(QUELLE in ('Réception_15','Réception_25'),'M11','M28')))))))))))))f(Missions) cross apply (values ( [START_DATE] ))v(T) cross apply (   values (convert(datetime, convert(date, getdate())),  convert(datetime, convert(date, getdate() - 1))) ) dates (today, yesterday) cross apply (  values (dateadd(hour, 6, yesterday),   dateadd(hour, 14, yesterday),   dateadd(hour, 21, yesterday),   dateadd(hour, 6, today)) ) dt (y6, y11, y22, t6) cross apply (  select  case when T gt;= y6 and T lt; y11 then 1 else 0 end Morning,  case when T gt;=y11 and T lt; y22 then 1 else 0 end PM,  case when T gt;=y22 and T lt; t6 then 1 else 0 end Night )c group by Missions  

Комментарии:

1. Я думаю, что вложенные iif можно записать как плоский случай, когда….

2. Пожалуйста, отмечайте только те СУБД, которые вы действительно используете.

3. После третьего Iif все условия одинаковы, поэтому эти дубликаты бесполезны.

4. Я просто не изменил условия, но все будет по-другому, это просто чтобы показать, что я ищу

5. Поместите значения в конструктор табличных значений и объедините их вместо использования CASE или IIF

Ответ №1:

Это перекрестное применение может быть изменено на ПРИМЕНЕНИЕ в СЛУЧАЕ, КОГДА

 outer apply (  select   case  when QUELLE IN ('Réception_13', 'Réception_19') then 'M3'  when QUELLE IN ('Réception_14', 'Réception_21') then 'M1'  when QUELLE IN ('Réception_15', 'Réception_25') then 'M4'  when QUELLE IN ('Réception_16', 'Réception_17') then 'M2'  else 'M8'  end ) f(Missions)  

Или ПРИМЕНИТЬ с выбором из значений.

 outer apply (  select top 1 Missions  from (values  ('Réception_13','M3'),  ('Réception_14','M1'),   ('Réception_15','M4'),  ('Réception_16','M2'),  ('Réception_17','M2'),  ('Réception_19','M3'),  ('Réception_21','M1'),  ('Réception_25','M4'),   (null, 'M8')  ) v(Réception, Missions)  where (Réception = QUELLE or Réception is null)   order by Réception desc ) f(Missions)  

Ответ №2:

Похоже, тебе действительно нужно присоединиться. Вы можете использовать реальную таблицу или виртуальную VALUES таблицу.

 LEFT JOIN (VALUES  ('Réception_14','M1'),  ('Réception_21','M1'),  ('Réception_17','M2'),  ('Réception_16','M2'),  ('Réception_13','M3'),  ('Réception_19','M3'),  ('Réception_15','M4'),  ('Réception_25','M4') ) f(Quelle, Missions) ON VIEW_JOBS_FINISHED_ALL.QUELLE = f.Quelle  

Я предлагаю вам всегда использовать короткие значимые псевдонимы таблиц