Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL多列取消PIVOT与命名行是否可能?_Sql Server_Tsql_Sql Server 2014_Unpivot_Cross Apply - Fatal编程技术网

Sql server TSQL多列取消PIVOT与命名行是否可能?

Sql server TSQL多列取消PIVOT与命名行是否可能?,sql-server,tsql,sql-server-2014,unpivot,cross-apply,Sql Server,Tsql,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

我知道这里有几个未经验证/交叉应用的讨论,但我找不到任何涉及我的问题的讨论。到目前为止,我得到的信息如下:

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行中

另外,我还使用cross apply进行了查询,但在这里,似乎无法像使用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方法提供以下输出:

    +--------------+---------+
    | Calculation  | Salary  |
    +--------------+---------+
    | Perc10       |      25 |
    | Perc25       |      35 |
    | Median       |      27 |
    +--------------+---------+
+---------+-------+
| Salary  | Bonus |
+---------+-------+
|      35 |    10 |
|      25 |     5 |
|      27 |     8 |
+---------+-------+
所以这里没有“奖金”一栏

交叉应用方法提供以下输出:

    +--------------+---------+
    | Calculation  | Salary  |
    +--------------+---------+
    | Perc10       |      25 |
    | Perc25       |      35 |
    | Median       |      27 |
    +--------------+---------+
+---------+-------+
| Salary  | Bonus |
+---------+-------+
|      35 |    10 |
|      25 |     5 |
|      27 |     8 |
+---------+-------+
因此,如果将其与预期的输出进行比较,您会注意到缺少列“Calculation”,行排序错误(请注意,第25 | 5行位于第二行,而不是第一行)

编辑2:视图的定义和示例数据: 该视图基本上只是添加表的计算列。在表中,我有一些列,比如每个JobID的薪水和奖金。然后,该视图只计算百分位数,如下所示:

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

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

这可能是您的方法吗

经过编辑后,我了解到,使用
交叉应用
的解决方案将返回正确的数据,但输出不正确。您可以将常量值添加到
值中
,并在包装中进行排序
选择

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

您的
vCalculatedView
似乎提前进行了计算。。。您的
分组依据
没有执行任何操作。。。请显示您的声明得到的结果,并提供一些示例数据和预期输出。交叉应用代码中的group by确实做了一些事情:如果我不将其放入,Perc10、Perc25、Median将反复出现。这是因为职务ID不是员工ID,因此,职务ID可能包含多个员工。确定。我明白你的意思。可能是,您更需要的是
CTE
SELECT DISTINCT
<代码>分组依据您将用于聚合,如
MAX()
SUM()
请提供当前查询的结果以及数据的显示方式。感谢您的回复!这里不清楚您指的是哪个查询。您是将Select Distinct引用到第一个选项(Unpivot)还是第二个选项(交叉应用)?至于输出,我在文章末尾的小表格显示了目的和unpivot给出的内容——尽管没有第二列。在交叉申请中,我得到了相同的结果,但没有“计算”列和所有其他列(工资、奖金)。但是,这里的输出没有排序,因此,例如,Perc25高于Perc10,而与上面所示的表中的一样。啊,我想我刚刚意识到了你的意思:你引用了交叉应用方法,并打算有一个With子句来引用像T这样的名称,并将其与Select*From T Group by一起使用。。。这就留下了一个问题:我如何得到“计算”栏,我可以用它按案例进行订购?谢谢!我认为你的解决方案是正确的。但是,对于其他读者,您需要将所有列(排序、计算、薪资、奖金)放入GROUPBY子句,而不仅仅是薪资和奖金。昨晚,我用带有CTE和LEFT JOIN的UNPIVOT方法编写了查询,但这当然是一段更长的代码。对于未来的读者,我将把这作为另一个答案,但这并不是要击败你的解决方案。您的解决方案再次表明,大多数情况下,交叉应用优于Unpivot,就像许多博客在比较中显示的那样。感谢您的接受!我编辑了我的答案,以反映您关于
按列分组的提示。如果你喜欢我的答案,请再投票赞成。投票和接受是两个独立的步骤。。。又来了!