我有三张桌子。 1)类别表,2)具有属于不同类别的报告的表和3)跟踪被访问的报告的事件表。我正在编写一个存储过程来排序和显示前十个或所有报告按类别排序,属于哪个报告获得了最大命中数。通过比较当前期间报告收到的点击数与前一期间收到的点击数来计算趋势。 这是表的简化模式。
ReportCategory Table
RportCategoryId CategoryName
ApplicationReport Table
ApplicationReportId ReportCategoryId ReportName
Events Table
EventId ReportId CreatedDate
如果在属于Inventory的报告期间获得最大命中数和销售额第二,那么结果应该是
Rank Category ReportName Percentage_Change Trend
1 Inventory Inventory Turn 42% Up
Inventory Inventory Stock 18% Up
2 Sales Discounted Sales 12% Down
Sales Sales return 30% Up
这就是我提出的
SELECT TOP 10 T1.CategoryName AS Category,T1.ReportName, (ABS(100 * (T1.TotalCategoryHits - T2.TotalCategoryHits)) / T2.TotalCategoryHits)+'%' AS PercentageChange,
CASE When (T1.TotalCategoryHits - T2.TotalCategoryHits) > 0 Then 'Upward'
WHEN (T1.TotalCategoryHits - T2.TotalCategoryHits) < 0 THEN 'Downward'
ELSE 'No Change' END AS Trend
FROM
(SELECT COUNT(c.CategoryId) AS TotalCategoryHits,COUNT(r.ReportCategoryId) Total,c.CategoryName,r.ReportName FROM Event e
inner join Reports r ON r.ReportId = CAST(e.ReportId As INT)
inner join Category c ON r.CategoryId = c.CategoryId
WHERE e.CreatedDate >= @CurrentPeriodStartDate AND e.CreatedBy <= @CurrentPeriodEndDate
GROUP BY c.ReportCategoryName,r.ReportName,e.ReportId) T1
INNER JOIN
(SELECT COUNT(c.CategoryId) AS TotalCategoryHits,COUNT(r.ReportCategoryId) Total,c.CategoryName,r.ReportName FROM Event e
inner join Reports r ON r.ReportId = CAST(e.ReportId As INT)
inner join Category c ON r.CategoryId = c.CategoryId
where e.CreatedDate >= @PrevPeriodStartDate And e.CreatedDate <= @PrevPeriodEndDate
GROUP BY c.ReportCategoryName,r.ReportName,e.ReportId) T2 on T1.ReportId = T2.ReportId
ORDER BY T1.TotalCategoryHits DESC
并且我没有达到理想的结果。 我希望按照已获得最大命中数的类别对行进行排序,但是当我在Group By中包含ReportName以使其成为结果的一部分时,我将失去排序。而且我也不知道如何显示排名。
编辑:Sql Fiddle
列的名称与我在这里的描述不同,因为我使用了原始Database的模式。由于某些未知原因,我的查询无效。可能是因为我更改了一些列名和类型。但是模式就在那里。