#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
Я предлагаю вам всегда использовать короткие значимые псевдонимы таблиц