【问题标题】:Selecting the most frequent value in a column based on the value of another column in the same row?根据同一行中另一列的值选择列中最频繁的值?
【发布时间】:2014-09-29 15:40:02
【问题描述】:

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

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

我一直在尝试解决这个问题,但一直没能解决:-(

【问题讨论】:

    标签: sql


    【解决方案1】:

    您的连接太多,没有关联子句。

    有几种方法可以解决这个问题。您已经从外部查询中的聚合开始,然后是嵌套子查询。所以,这延续了这种方法。我认为这可以满足您的要求:

    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 表。这似乎不需要(尽管它可以用于过滤)。
    • group by 子句中添加了s.StoredId。这是子查询中的关联所必需的。
    • 添加了where 子句,因此对于外部查询中的每个存储,子查询只处理一次。
    • 删除了子查询中与Store 的连接。如果可以在 StoreId 上关联查询,这似乎没有必要。
    • 将子查询中的group by 更改为使用Details。这就是选择的值。
    • 添加了表别名,使查询更易于编写和阅读。

    【讨论】:

    • 我不太明白为什么我们要在子查询中添加 WHERE id2.StoreID = s.StoreID 子句,因为结果我已经选择了每个商店一次
    • @DavidFlynn 。 . .查找“相关子查询”。您可以将子查询视为对每个商店运行一次,而 where 子句是引擎知道如何执行此操作的方式。
    猜你喜欢
    • 1970-01-01
    • 2014-10-05
    • 2012-05-29
    • 2023-03-23
    • 2022-09-29
    • 2021-05-25
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多