【问题标题】:SSRS - Median by Group - Jagged Array?SSRS - 组中位数 - 锯齿状阵列?
【发布时间】:2015-07-08 23:22:04
【问题描述】:

我面临两方面的挑战。我被要求替换矩阵中的 3 列,该矩阵在行组中的名称上聚合。这 3 列在 Column 组之外。

挑战 1 - 矩阵想要汇总数据窗格。似乎没有办法显示原始数据(然后隐藏它,以便在运行时这些行填充数组)。

挑战 2 - 我需要按名称计算中位数。这意味着,在运行时,我需要一次为每个名称计算一个中值,重置数组,然后重新开始下一个名称值,或者,我需要一个多维数组,其中每个序数本身就是一个对应的数组一个名字。

我也是 VB 的一个总代码猴子。

这是我目前从在线帖子中借来的关于在 SSRS 中计算中位数的内容。

    Dim values As System.Collections.ArrayList

    Function AddValue(ByVal newValue As Decimal)
        If (values Is Nothing) Then
            values = New System.Collections.ArrayList()
        End If
        values.Add(newValue)
    End Function

    Function GetMedian() As Decimal
        Dim count As Integer = values.Count
        If (count > 0) Then
            values.Sort()
            GetMedian = values(count / 2)
        End If
    End Function

【问题讨论】:

  • SQL Server 2012。我的意思是...我可以将它放入 SQL 中的循环中,但是...我真的不喜欢 RBAR,它会给查询增加很多开销。最终可能不得不这样做,因为当你只有一把锤子时,一切看起来都像钉子。
  • 在tsql中PERCENTILE_CONT函数为中位数msdn.microsoft.com/en-us/library/hh231473(v=sql.110).aspx
  • 是的,看起来这行得通!感谢内置 SQL 函数!

标签: vba reporting-services jagged-arrays


【解决方案1】:

我想我有一个不使用循环的 SQL 解决方案。

;WITH Counts AS
(
   SELECT SalesPerson, c = COUNT(*)
   FROM dbo.Sales
   GROUP BY SalesPerson
)
SELECT a.SalesPerson, Median = AVG(0.+Amount)
FROM Counts a
CROSS APPLY
(
   SELECT TOP (((a.c - 1) / 2) + (1 + (1 - a.c % 2)))
      b.Amount, r = ROW_NUMBER() OVER (ORDER BY b.Amount)
   FROM dbo.Sales b
   WHERE a.SalesPerson = b.SalesPerson
   ORDER BY b.Amount
) p
WHERE r BETWEEN ((a.c - 1) / 2) + 1 AND (((a.c - 1) / 2) + (1 + (1 - a.c % 2)))
GROUP BY a.SalesPerson;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2011-02-04
    相关资源
    最近更新 更多