Пользовательская таблица с использованием нескольких выборок в SQL Server

#sql #sql-server #database #tsql

#sql #sql-server #База данных #tsql

Вопрос:

У меня есть таблица с несколькими миссиями с информацией о выборе и отбрасывании времени и имени.

У меня есть эти данные:

ID ВЫБЕРИТЕ УДАЛЕНИЕ Дата
Задание 1 A 1 12/11/2021-09:32
Миссия 2 B 1 12/11/2021-12:32
Миссия 3 D 2 12/11/2021-10:32
Миссия 4 A 5 12/11/2021-19:32

Что я хочу сделать, так это создать таблицу для группировки по потоку, в нашем примере наш поток:

  • Поток 1: все выборки из A и D
  • Поток 2: все выборки из B и C

Все это сгруппировано в 3 столбца с использованием даты. на нашем примере это будет выглядеть так:

Поток Утро PM НОЧЬ ИТОГО
ПОТОК 1 2 1 0 3
ПОТОК 2 0 1 0 1

Вот что я ищу:

1-й выбор: первая строка связанных выборок A и B

 select *
from table mission 
where pick = A or pick = D 
as the flow1 

select count(*)
from flow1 
where date.hour < 11:01 -- this information as to be stored on the column morning 
 

Есть ли способ получить этот результат с помощью SQL Server?

Спасибо за вашу помощь.

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

1. Почему A и D и как «Поток 1» ассоциируется с этими строками / значениями? Какая логика определяет, что поток 1 имеет 1 в столбце AM, 2 в утреннем столбце и 0 в ночном столбце? Для меня «AM» означает «утро» (в отличие от дня или вечера). Какова ваша логика?

2. Можете ли вы объяснить классификации времени, которые приводят к Morning / AM / Night, и какое отношение имеют столбцы ID или DROP к результатам примера?

3. Я изменяю ее «утром / вечером / ночью, утром это означает, что до 11 утра, вечера между 11:01 и 10 вечера и ночью между 6 утра 10:01 вечера и 6 утра

4. Это необычная классификация времени, поскольку PM обычно указывает на постмеридианальный период, после полудня.

5. Кроме того, это не работает для ваших тестовых данных, ваши результаты показывают, что Flow1 имеет 2 для morning, но у вас есть только 1 соответствующая строка.

Ответ №1:

Следующий «вид» дает желаемые результаты — я не совсем понимаю ваши классификации времени, но вы можете внести в них соответствующие изменения.

Используется Apply для вычисления промежуточных требуемых результатов (для сохранения повторяющихся условий или для запроса вложенного запроса / CTE):

 select Flow, Sum(Morning) Morning, Sum(PM) PM, Sum(Night) Night, Count(*) Total
from t
cross apply (values (Iif(pick in ('A','D'),'Flow 1','Flow 2')))f(Flow)
cross apply (values ( Convert(time, [DATE] )))v(T)
cross apply (
    select
        case when T >='06:00:00' and T < '11:00:00' then 1 else 0 end Morning,
        case when T >='11:00:00' and T < '22:00:00' then 1 else 0 end PM,
        case when T >='22:00:00' and T < '06:00:00' then 1 else 0 end Night
)c
group by Flow
 

См. Демонстрационную скрипку

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

1. Поток он не существует это имя, которое я хочу дать ассоциации A и B.

2. @SalahBelabed Да, я это понимаю, вы пробовали этот запрос? Смотрите рабочий пример

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

4. So iif — это просто синтаксический сахар для case и case when else имеет ограничение вложенности 10; однако вы все равно можете использовать case when без каких-либо else criteria , case выражение вернется после первого совпадающего случая, так что вы можете просто сделать case when a then b when c then d ... end и т. Д

Ответ №2:

Вы можете использовать РЕГИСТР ВЫБОРА ([PICK] = ‘A’ ИЛИ [PICK] = ‘C’, «ПОТОК 1», «ПОТОК 2») В КАЧЕСТВЕ ПОТОКА, а затем сгруппировать по ПОТОКУ

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

1. Это было бы лучшим ответом, если бы вы выписали оператор select, который им нужен, и включили все результаты, которые они ищут. Как опубликовано в настоящее время, это больше похоже на комментарий, чем на ответ.