#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, который им нужен, и включили все результаты, которые они ищут. Как опубликовано в настоящее время, это больше похоже на комментарий, чем на ответ.