TSQL可以使用命名行进行多列unpivot?

ksa*_*ter 6 t-sql sql-server unpivot cross-apply sql-server-2014

我知道这里有几个unpivot/cross apply讨论,但我找不到任何涵盖我的问题的讨论.到目前为止我得到的是以下内容:

SELECT Perc, Salary
FROM (
    SELECT jobid, Salary_10 AS Perc10, Salary_25 AS Perc25, [Salary_Median] AS Median
    FROM vCalculatedView
    WHERE JobID = '1'
    GROUP BY JobID, SourceID, Salary_10, Salary_25, [Salary_Median]
) a
UNPIVOT (
    Salary FOR Perc IN (Perc10, Perc25, Median)
) AS calc1
Run Code Online (Sandbox Code Playgroud)

现在,我想要添加其他几个列,例如.一个名为Bonus,我也想放入Perc10,Perc25和Median Rows.

作为替代方案,我也使用交叉应用进行了查询,但是在这里,似乎你不能像强制转换那样"强制"对行进行排序.换句话说,我不能有一个自定义排序,但只有一个根据表中的数字排序,如果我是正确的?至少,在这里我得到的结果就像我希望的那样,但是行的顺序是错误的,而且我没有像Perc10那样的行名称,这样会很好.

SELECT crossapplied.Salary,
       crossapplied.Bonus
FROM vCalculatedView v
CROSS APPLY (
    VALUES
          (Salary_10, Bonus_10)
        , (Salary_25, Bonus_25)
        , (Salary_Median, Bonus_Median)
) crossapplied (Salary, Bonus)
WHERE JobID = '1'
GROUP BY crossapplied.Salary,
         crossapplied.Bonus
Run Code Online (Sandbox Code Playgroud)

Perc在这里代表Percentile.

输出意图是这样的:

+--------------+---------+-------+
| Calculation  | Salary  | Bonus |
+--------------+---------+-------+
| Perc10       |      25 |     5 |
| Perc25       |      35 |    10 |
| Median       |      27 |     8 |
+--------------+---------+-------+
Run Code Online (Sandbox Code Playgroud)

我错过了什么或者我做错了吗?我正在使用MSSQL 2014,输出正在进入SSRS.非常感谢任何提前提示!

编辑以进行说明: Unpivot-Method提供以下输出:

    +--------------+---------+
    | Calculation  | Salary  |
    +--------------+---------+
    | Perc10       |      25 |
    | Perc25       |      35 |
    | Median       |      27 |
    +--------------+---------+
Run Code Online (Sandbox Code Playgroud)

所以它缺少"Bonus"栏目.

Cross-Apply-Method提供以下输出:

+---------+-------+
| Salary  | Bonus |
+---------+-------+
|      35 |    10 |
|      25 |     5 |
|      27 |     8 |
+---------+-------+
Run Code Online (Sandbox Code Playgroud)

因此,如果将其与预期输出进行比较,您会注意到"计算"列缺失且行排序错误(请注意,第25行是第2行而不是第1行).

编辑2:视图的定义和示例数据: 视图基本上只是添加了表的计算列.在表格中,我为每个JobID提供了薪水和奖金等列.View然后只计算这样的百分位数:

Select 
    Percentile_Cont(0.1)
    within group (order by Salary)
    over (partition by jobID) as Salary_10,

    Percentile_Cont(0.25)
    within group (order by Salary)
    over (partition by jobID) as Salary_25
from Tabelle
Run Code Online (Sandbox Code Playgroud)

所以输出如下:

+----+-------+---------+-----------+-----------+
| ID | JobID | Salary  | Salary_10 | Salary_25 |
+----+-------+---------+-----------+-----------+
|  1 |     1 |     100 |        60 |        70 |
|  2 |     1 |     100 |        60 |        70 |
|  3 |     2 |     150 |        88 |       130 |
|  4 |     3 |      70 |        40 |        55 |
+----+-------+---------+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)

最后,视图将在存储过程中进行参数化.

Shn*_*ugo 1

这可能是你的方法吗?

编辑后,我了解到,您的解决方案CROSS APPLY将返回正确的数据,但不会出现正确的输出。您可以向您添加常量值VALUES并在包装器中进行排序SELECT

SELECT wrapped.Calculation,
       wrapped.Salary,
       wrapped.Bonus
FROM
(
    SELECT crossapplied.*
    FROM vCalculatedView v
    CROSS APPLY (
        VALUES
              (1,'Perc10',Salary_10, Bonus_10)
            , (2,'Perc25',Salary_25, Bonus_25)
            , (3,'Median',Salary_Median, Bonus_Median)
    ) crossapplied (SortOrder,Calculation,Salary, Bonus)
    WHERE JobID = '1'
    GROUP BY crossapplied.SortOrder,
             crossapplied.Calculation,
             crossapplied.Salary,
             crossapplied.Bonus
) AS wrapped
ORDER BY wrapped.SortOrder
Run Code Online (Sandbox Code Playgroud)