根据同一行中另一列的值选择列中最频繁的值?

问题描述:

所以基本上我想要做的是为我们的商店生成报告。我们有一个事件报告网站,员工可以在其中报告任何商店发生的事件。因此,在我想要生成的一般报告中,我想展示我们每个商店的详细信息(五家商店)。这将包括商店名称,事件数量,最早的事件日期,最新的事件日期以及每个商店最常见的事件类型。根据同一行中另一列的值选择列中最频繁的值?

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]值是相同的。基本上,它为整个表获取最常见的事件值,而不管它来自哪个存储区,然后显示每个存储区的值,即使不同的存储区具有不同的列值。

我一直在试图解决现在这一段时间,但一直没能:-(

你有太多的连接和不相关的条款。

有几种方式来处理。这个问题你已经开始与外部查询聚集,然后嵌套子查询所以,这延续了这一做法,我认为这样做你想要什么:

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