所以基本上我要做的就是为我们的商店生成报告。我们有一个事故报告网站,员工可以在其中报告我们任何一家商店发生的事故。因此,在我试图生成的一般报告中,我想显示我们拥有的每家商店的详细信息(五家商店)。这将包括商店的名称,事件数量,最早的事件日期,最新的事件日期,然后是每家商店最常见的事件类型。
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行,但[最常见事件]值对于每一行都是相同的。基本上,它获取整个表的最常见事件值,无论它来自哪个存储,然后为每个商店显示,即使不同的商店具有不同的列值。
我一直试图解决这个问题一段时间但未能: - (
答案 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
。这就是所选择的价值。