根据同一行中另一列的值选择列中最常用的值?

时间:2014-09-29 15:40:03

标签: sql

所以基本上我要做的就是为我们的商店生成报告。我们有一个事故报告网站,员工可以在其中报告我们任何一家商店发生的事故。因此,在我试图生成的一般报告中,我想显示我们拥有的每家商店的详细信息(五家商店)。这将包括商店的名称,事件数量,最早的事件日期,最新的事件日期,然后是每家商店最常见的事件类型。

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行,但[最常见事件]值对于每一行都是相同的。基本上,它获取整个表的最常见事件值,无论它来自哪个存储,然后为每个商店显示,即使不同的商店具有不同的列值。

我一直试图解决这个问题一段时间但未能: - (

1 个答案:

答案 0 :(得分: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。这就是所选择的价值。
  • 添加了表别名,使查询更易于编写和阅读。