TSQL 多列 unpivot 与命名行可能吗?
TSQL Multiple column unpivot with named rows possible?
我知道这里有几个 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 那样对行进行 "force" 排序。换句话说,我不能有自定义排序,而只能根据 table 内的数字排序,如果我是正确的?至少,在这里我确实得到了我希望的结果,但是行的顺序错误,而且我没有像 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 |
+---------+-------+
因此,如果将其与预期输出进行比较,您会注意到 "Calculation" 列缺失并且行排序错误(请注意,第 25 | 5 行位于第二行,而不是第一个)。
编辑 2:视图的定义和示例数据:
该视图基本上只是添加 table 的计算列。在 table 中,我为每个 JobID 设置了 Salary 和 Bonus 等列。 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 |
+----+-------+---------+-----------+-----------+
最后,视图将在存储过程中参数化。
这可能是你的方法吗?
据我所知,在您进行编辑后,您使用 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
我知道这里有几个 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 那样对行进行 "force" 排序。换句话说,我不能有自定义排序,而只能根据 table 内的数字排序,如果我是正确的?至少,在这里我确实得到了我希望的结果,但是行的顺序错误,而且我没有像 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 |
+---------+-------+
因此,如果将其与预期输出进行比较,您会注意到 "Calculation" 列缺失并且行排序错误(请注意,第 25 | 5 行位于第二行,而不是第一个)。
编辑 2:视图的定义和示例数据: 该视图基本上只是添加 table 的计算列。在 table 中,我为每个 JobID 设置了 Salary 和 Bonus 等列。 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 |
+----+-------+---------+-----------+-----------+
最后,视图将在存储过程中参数化。
这可能是你的方法吗?
据我所知,在您进行编辑后,您使用 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