gpt4 book ai didi

sql-server - TSQL 可以使用命名行进行多列逆透视吗?

转载 作者:行者123 更新时间:2023-12-02 21:09:05 25 4
gpt4 key购买 nike

我知道这里有几个 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

现在,我想要添加其他几个列,例如。一个名为 Bonus,我还想将其放入 Perc10、Perc25 和 Median Rows 中。

作为替代方案,我还使用交叉应用进行了查询,但在这里,似乎您无法像使用 unpivot 那样“强制”对行进行排序。换句话说,我不能进行自定义排序,而只能根据表中的数字进行排序,如果我是正确的?至少,在这里我确实得到了我想要的结果,但是行的顺序错误,而且我没有像 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

这里 Perc 代表百分位数。

输出应该是这样的:

+--------------+---------+-------+
| Calculation | Salary | Bonus |
+--------------+---------+-------+
| Perc10 | 25 | 5 |
| Perc25 | 35 | 10 |
| Median | 27 | 8 |
+--------------+---------+-------+

我错过了什么还是我做错了什么?我正在使用 MSSQL 2014,输出将进入 SSRS。非常感谢您提前提供任何提示!

编辑以澄清:Unpivot-Method 提供以下输出:

    +--------------+---------+
| Calculation | Salary |
+--------------+---------+
| Perc10 | 25 |
| Perc25 | 35 |
| Median | 27 |
+--------------+---------+

所以这里缺少“Bonus”栏。

交叉应用方法给出以下输出:

+---------+-------+
| Salary | Bonus |
+---------+-------+
| 35 | 10 |
| 25 | 5 |
| 27 | 8 |
+---------+-------+

因此,如果将其与预期输出进行比较,您会注意到缺少“计算”列,并且行排序错误(请注意,第 25 | 5 行位于第二行而不是第一行)。

编辑2: View 的定义和示例数据:该 View 基本上只是添加表的计算列。在表中,我为每个 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

所以输出是这样的:

+----+-------+---------+-----------+-----------+
| 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 |
+----+-------+---------+-----------+-----------+

最后, View 将在存储过程中参数化。

最佳答案

这可能是你的方法吗?

编辑后,我了解到,您使用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

关于sql-server - TSQL 可以使用命名行进行多列逆透视吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36150341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com