Sql Group by和Ordering

时间:2015-11-21 18:53:35

标签: sql-server

我有三张桌子。 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的模式。由于某些未知原因,我的查询无效。可能是因为我更改了一些列名和类型。但是模式就在那里。

0 个答案:

没有答案