2014-09-29 125 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

這就像一個魅力! – 2014-09-29 16:23:19

+0

我不太明白爲什麼我們將WHERE id2.StoreID = s.StoreID子句添加到子查詢中,因爲我反正選擇了每個商店的結果 – 2014-09-29 16:24:24

+0

@DavidFlynn。 。 。查找「相關子查詢」。您可以將子查詢視爲針對每個商店運行一次,並且where子句是引擎知道如何執行該操作的條款。 – 2014-09-29 19:38:47

相關問題