#sql #minimum
Вопрос:
Я пытаюсь найти минимальное значение для идентификатора (строки) из 6 столбцов значений. Сначала мне нужно выполнить запрос из таблицы, в которой есть строковые значения, такие как «частичное заполнение», нулевые значения,отсутствующие строки, которые я устанавливаю в числовое значение, соответствующее последовательности этого шага (шаг 1, шаг 2, шаг 3.шаг 4,шаг 5,шаг 6). В противном случае я устанавливаю его равным нулю, и мне плевать на нули при расчете минимального значения.
Поэтому я подумал, что мог бы использовать инструкцию case, чтобы просмотреть и рассчитать минимальное значение, но я не получаю этого последовательно. Ниже приведен мой код, поэтому, если мне нужно будет внести лучшие решения или изменения, пожалуйста, дайте мне знать. Заранее благодарю вас! Извините, что я неправильно отформатировал это
Select pt.PROJECT_NUMBER, pt.STEP1, pt.STEP2, pt.STEP3, pt.STEP4, pt.STEP5, pt.STEP6,
CASE WHEN STEP1 = 'PARTIAL COMPLETE' OR STEP1 IS NULL OR STEP1 = '' THEN 1 ELSE 0 END AS step1_val,
CASE WHEN STEP2 = 'PARTIAL COMPLETE' OR STEP2 IS NULL OR STEP2 = '' THEN 2 ELSE 0 END AS step2_val,
CASE WHEN STEP3 = 'PARTIAL COMPLETE' OR STEP3 IS NULL OR STEP3 = '' THEN 3 ELSE 0 END AS step3_val,
CASE WHEN STEP4 = 'PARTIAL COMPLETE' OR STEP4 IS NULL OR STEP4 = '' THEN 4 ELSE 0 END AS step4_val,
CASE WHEN STEP5 = 'PARTIAL COMPLETE' OR STEP5 IS NULL OR STEP5 = '' THEN 5 ELSE 0 END AS step5_val,
CASE WHEN STEP6 = 'PARTIAL COMPLETE' OR STEP6 IS NULL OR STEP6 = '' THEN 6 ELSE 0 END AS step6_val
INTO #Temp
FROM
ProjectTracker.GIS.PROJECT_TRACKING pt
WHERE PROJECT_RECEIVED = 'YES' AND PROJECT_NUMBER = '5797'
SELECT * FROM #Temp
Select PROJECT_NUMBER,
Case When step1_val < step2_val And step1_val < step3_val And step1_val < step4_val And step1_val < step5_val And step1_val < step6_val Then step1_val
When step2_val < step1_val And step2_val < step3_val And step2_val < step4_val And step2_val < step5_val And step2_val < step6_val Then step2_val
When step3_val < step1_val And step3_val < step2_val And step3_val < step4_val And step3_val < step5_val And step3_val < step6_val Then step3_val
When step4_val < step1_val And step4_val < step2_val And step4_val < step3_val And step4_val < step5_val And step4_val < step6_val Then step4_val
When step5_val < step1_val And step5_val < step2_val And step5_val < step3_val And step5_val < step4_val And step5_val < step6_val Then step5_val
Else step6_val
End As TheMin
From #Temp
Drop Table #Temp
Это приводит к результатам на изображении, очевидно, ожидаемый результат должен быть 5, поэтому я не уверен, где я ошибся
Комментарии:
1. Этот дизайн стола-настоящий кошмар. Что произойдет, если в будущем у вас будет еще один шаг? Вам придется все перепроектировать. Пожалуйста, внимательно прочитайте эту статью en.wikipedia.org/wiki/Database_normalization и переработайте свою базу данных, пока не стало слишком поздно 😉
2. @Клаус — спасибо за ваши добрые слова. Я задал очень простой вопрос и надеялся на некоторую помощь, а не на лекцию о том, насколько я ужасен в sql. спасибо, хотя
Ответ №1:
Похоже, это работает:
Select pt.PROJECT_NUMBER, pt.STEP1, pt.STEP2, pt.STEP3, pt.STEP4, pt.STEP5, pt.STEP6,
Случай, когда Шаг1 = ‘частичное полное или Шаг1 имеет значение null или Шаг1 =» 1 потом еще null конец как step1_val,
Случай, когда ШАГ2 = ‘частичное полное или Step2 имеет значение null или Step2 =» 2 тогда еще null конец как step2_val,
Случай, когда Шаг 3 = ‘частичное полное или является null Шаг 3 или Шаг 3 =» 3 тогда еще null конец как step3_val,
Случай, когда Шаг 4 = ‘частичное полное или ШАГ4 имеет значение null или ШАГ4 =» 4 потом еще null конец как step4_val,
Случай, когда Шаг 5 = ‘частичное полное или ШАГ5 имеет значение null или ШАГ5 =» 5 тогда еще null конец как step5_val,
СЛУЧАЙ, КОГДА ШАГ 6 = «ЧАСТИЧНОЕ ЗАВЕРШЕНИЕ» ИЛИ ШАГ 6 РАВЕН НУЛЮ ИЛИ ШАГ 6 = » ТОГДА 6 ЕЩЕ ЗАКАНЧИВАЕТСЯ НУЛЕМ КАК step6_val
В #Темп
ИЗ ProjectTracker.GIS.PROJECT_TRACKING, ГДЕ PROJECT_RECEIVED = » ДА » —И НОМЕР ПРОЕКТА = «11782»
ВЫБЕРИТЕ * ИЗ #Temp
ВЫБЕРИТЕ НОМЕР ПРОЕКТА,МИНИМУМ(x.a) ИЗ ( ВЫБЕРИТЕ НОМЕР ПРОЕКТА,шаг 1_вал а ИЗ #ВРЕМЕННОГО ОБЪЕДИНЕНИЯ ВЫБЕРИТЕ НОМЕР ПРОЕКТА,шаг 2_вал а ИЗ #ВРЕМЕННОГО ОБЪЕДИНЕНИЯ ВЫБЕРИТЕ НОМЕР ПРОЕКТА,шаг 3_вал а ИЗ #ВРЕМЕННОГО ОБЪЕДИНЕНИЯ ВЫБЕРИТЕ НОМЕР ПРОЕКТА,шаг 4_вал а ИЗ #ВРЕМЕННОГО ОБЪЕДИНЕНИЯ ВЫБЕРИТЕ НОМЕР ПРОЕКТА,шаг 5_вал а ИЗ #ВРЕМЕННОГО ОБЪЕДИНЕНИЯ ВЫБЕРИТЕ НОМЕР ПРОЕКТА,шаг 6_вал а ИЗ #Temp ) x ГРУППИРОВАТЬ ПО НОМЕРУ ПРОЕКТА
Отбросьте таблицу #Temp