2016-10-14 6 views
4

Я один основной вопрос: Я попытался создать запрос в SQL:группы столбец зависит от результата

Select Date, Status From Table 

мой результат, например,

2016-06-07 FAILED 
2016-06-07 FINISH OK 
2016-07-07 FINISH OK 
2016-07-07 FINISH OK 

Можно чтобы сообщить Если статус «НЕИСПРАВНО» от 2016-06-07, напечатайте только одну строку со статусом отказа. Если он просто закончен, печать закончена. Я хотел бы этот результат:

2016-06-07 FAILED 
2016-07-07 FINISH OK 

Спасибо,

EDIT: У меня есть только 2 состояния: FAILED и FINISH OK

все больше и больше даты и результаты:

2016-06-07 FAILED 
2016-06-07 FINISH OK 
2016-06-07 FINISH OK 
2016-06-07 FINISH OK 
2016-06-07 FINISH OK 

2016-07-07 FINISH OK 
2016-07-07 FINISH OK 
2016-07-07 FINISH OK 
2016-07-07 FINISH OK 
2016-07-07 FINISH OK 

2016-07-08 FINISH OK 
2016-07-08 FINISH OK 
2016-07-08 FINISH OK 
2016-07-08 FAILED 
2016-07-08 FINISH OK 

Хотелось бы иметь:

2016-06-07 FAILED 
2016-07-07 FINISH OK 
2016-07-08 FAILED 

Если у меня есть статус FAILED в дате, я бы хотел напечатать «FAILED», но если у меня нет статуса «FAILED», я бы напечатал «FINISH OK», это лучше?

+1

пожалуйста, добавьте больше данных для более дат – TheGameiswar

+1

Добавить несколько фиников с различным статусом и сказать что должно быть результатом –

+0

Привет, спасибо за вашу помощь, я обновляю сообщение. Это бетт? – Bob

ответ

5

использовать a CASE с условным агрегированием.

Первый COUNT - это просто показать вам, как работать. Это будет подсчитывать количество сбоев в каждой группе дат.

Тогда следующий CASE проверить, если есть один или более не в состоянии

SELECT Date, 
     COUNT(CASE WHEN Status = 'FAILED' THEN 1 END) as total_fails,   
     CASE WHEN Count(CASE WHEN Status = 'FAILED' THEN 1 END) > 0 
      THEN 'FAILED' 
      ELSE 'FINISH OK' 
     END as Status 
FROM Table 
GROUP BY Date 
+0

Super !!!Работает ! Я попробую другой комментарий! Большое спасибо!!!!! – Bob

+1

Я думаю, что @MisterPositive - самый простой ответ, если у вас есть только два статуса. Но мой более общий и может быть адаптирован к нескольким случаям. –

+0

Хорошо, я понимаю. Я могу добавить все больше и больше статуса, если мне нужно с вашим решением. Благодаря ! – Bob

-1

Хотите добавить группу по дате или статусу?

SELECT Date, Status FROM Table GROUP BY Date 

или

SELECT Date, Status FROM Table GROUP BY Status 

Если у вас есть группа по, вы можете также иметь некоторую обобщенную информацию. Можете ли вы объяснить немного больше?

+0

Это не сработает, вам нужно сгруппировать по статусу и дате, если вам нужны те, которые находятся в Select –

3

Вы можете использовать TOP 1 с галстуками с ROW_NUMBER:

SELECT TOP 1 WITH TIES 
        [Date], 
        [Status] 
From [Table] 
ORDER BY ROW_NUMBER() OVER (PARTITION BY [Date] ORDER BY [Status] ASC) 

Выход:

Date  Status 
2016-06-07 FAILED 
2016-07-07 FINISH OK 
2016-07-08 FAILED 
+0

Супер! Он тоже работает! Что лучше всего использовать? ваш или результат чуть ниже (со счетом и футляром)? – Bob

+1

Вероятно, вы должны проверить его как с помощью 'EXPLAIN' –

+1

. Я не думаю, что вы получите какое-то время/производительность, используя любое из данных решений. :) Лично я выберу тот, который предложил MisterPositive, простой, но должен работать нормально. – gofr1

3

Этот должен работать:

Select Date, MIN(Status) 
From Table 
Group By Date 
+1

Вместо этого используйте 'MIN', вы хотите, чтобы' FAIL' был первым выбором. –

+0

Работа тоже! Я думал, что MAX и MIN просто для номера? Какова логика, когда у нас есть String? Спасибо – Bob

+2

То же самое, но используйте алфавитную последовательность '' A '<' B'' и ''A' <'AA'' –

1

Хотя я использую тот же подход, что и выше, но я думаю, что это может быть более простым, используя COUNT DISTINCT, как показано ниже:

SELECT date, 
    CASE WHEN COUNT(DISTINCT status)>1 
     THEN 'FAILED' 
     ELSE 'FINISH OK' 
    END AS status 
FROM table 
GROUP BY date 
+0

Это создаст двойные строки для данных с обоими значениями. –

+0

@JuanCarlosOropeza Я обновил свой ответ, пожалуйста, проверьте, надеюсь, что вы найдете его более простым и понятным. – Susang

+0

Да, это тоже должно работать. –

Смежные вопросы