根据同一行中另一列的值选择列中最频繁的值?
问题描述:
所以基本上我想要做的是为我们的商店生成报告。我们有一个事件报告网站,员工可以在其中报告任何商店发生的事件。因此,在我想要生成的一般报告中,我想展示我们每个商店的详细信息(五家商店)。这将包括商店名称,事件数量,最早的事件日期,最新的事件日期以及每个商店最常见的事件类型。根据同一行中另一列的值选择列中最频繁的值?
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
。这是被选中的价值。 - 添加了表别名,这使查询更易于编写和阅读。
这就像一个魅力! – 2014-09-29 16:23:19
我不太明白为什么我们将WHERE id2.StoreID = s.StoreID子句添加到子查询中,因为我反正选择了每个商店的结果 – 2014-09-29 16:24:24
@DavidFlynn。 。 。查找“相关子查询”。您可以将子查询视为针对每个商店运行一次,并且where子句是引擎知道如何执行该操作的条款。 – 2014-09-29 19:38:47