2014-09-29 5 views
0

Так что в основном то, что я пытаюсь сделать, это генерировать отчет для наших магазинов. У нас есть веб-сайт отчета об инциденте, на котором сотрудники могут сообщать об инциденте, который происходит в любом из наших магазинов. Поэтому в общем отчете, который я пытаюсь создать, я хочу показать детали каждого магазина, который у нас есть (пять магазинов). Это будет включать название магазина, количество инцидентов, самую раннюю дату инцидента, дату последнего инцидента, а затем самый повторяющийся тип инцидента в каждом магазине.Выбор наиболее частого значения в столбце на основе значения другого столбца в той же строке?

SELECT Store.Name AS [Store Name], COUNT(*) AS [No. Of Incidents], Min(CAST(DateNotified AS date)) AS [Oldest Incident], Max(CAST(DateNotified AS date)) AS [Latest Incident], 
     ( SELECT TOP 1 IncidentType.Details 
      FROM   IncidentDetails 
      INNER JOIN Store ON IncidentDetails.StoreID = Store.StoreID 
      INNER JOIN IncidentType On IncidentDetails.IncidentTypeID = IncidentType.IncidentTypeID 
      Group By IncidentType.Details, IncidentDetails.StoreID 
      Order By COUNT(IncidentType.Details) DESC) AS [Most Freqeuent Incident] 
FROM IncidentDetails 
INNER JOIN Store ON IncidentDetails.StoreID = Store.StoreID 
INNER JOIN IncidentType On IncidentDetails.IncidentTypeID = IncidentType.IncidentTypeID 
GROUP BY Store.Name 

Просто чтобы было ясно, что IncidentDetails таблица хранит все подробности об инциденте в том числе, которые хранят это происходило на то, что тип инцидента был, времени/даты и т.д. Что это делает, хотя это дает мне 5 строк для каждого хранилища, но значение [Most Frequent Incident] одинаково для каждой строки. В основном, он получает наиболее частое значение инцидента для всей таблицы, независимо от того, в каком хранилище он появился, и затем отображает это для каждого хранилища, даже если разные магазины имеют разные значения для столбца.

Я пытался решить эту проблему на некоторое время теперь, но не смогли :-(

ответ

2

У вас есть слишком много соединений и не корреляционная пункт.

Есть несколько способов приблизиться к ... эта проблема вы уже начали с агрегацией во внешнем запросе, а затем вложенный подзапрос Таким образом, это будет продолжаться этот подход, я думаю, что это то, что вы хотите:

SELECT s.Name AS [Store Name], COUNT(*) AS [No. Of Incidents], 
     Min(CAST(DateNotified AS date)) AS [Oldest Incident], 
     Max(CAST(DateNotified AS date)) AS [Latest Incident], 
     (SELECT TOP 1 it.Details 
     FROM IncidentDetails id2 INNER JOIN 
      IncidentType it2 
      On id2.IncidentTypeID = it2.IncidentTypeID 
     WHERE id2.StoreId = s.StoreId 
     Group By it.Details 
     Order By COUNT(*) DESC 
     ) AS [Most Freqeuent Incident] 
FROM IncidentDetails id INNER JOIN 
    Store s 
    ON id.StoreID = s.StoreID 
GROUP BY s.Name, s.StoreId; 

Примечания:

  • Удалена таблица IncidentType из внешних соединений. Это не кажется необходимым (хотя оно может использоваться для фильтрации).
  • Добавлен s.StoredId в статью group by. Это необходимо для корреляции в подзапросе.
  • Добавлено условие where, поэтому подзапрос обрабатывается только один раз для каждого хранилища во внешнем запросе.
  • Удалено соединение Store в подзапросе. Это кажется ненужным, если запросы могут быть скоррелированы по StoreId.
  • Изменен group by в подзапросе для использования Details. Это значение выбирается.
  • Добавлены псевдонимы таблиц, которые упрощают чтение и чтение запросов.
+0

Это работало как очарование! –

+0

Я не совсем понимаю, почему мы добавляем предложение WHERE id2.StoreID = s.StoreID в подзапрос, так как результат я каждый раз выбрал каждый магазин –

+0

@DavidFlynn. , , Посмотрите «коррелированный подзапрос». Вы можете думать о том, что подзапрос работает как один раз для каждого хранилища, а предложение 'where' - то, как движок знает, как это сделать. –

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