列到行和行到列转换没有pivot / unpivot

时间:2017-08-26 13:12:01

标签: sql sql-server tsql

我需要的只是将列(A1 / A2)转换为行和行(1到1月)到列中。 输入:

这里A1 / A2属于A,它们按每个月的A1 / A2计算。

Month   A1  A2  B1  B2  C1  C2
1      120  60  40  80  120 120
2      50   50  40  20  60  30
3      50   25  40  10  90  30

我需要低于o / p而不使用pivot和unpivot

O / P:

X   Jan(1 is denoting Jan)     Feb      Mar
A   120/60(calculation:A1/A2)   40/80   120/120
B   50/50                      40/20    60/30
C   50/25                       40/10   90/30

我试过,但我的查询太长了,因为我每次使用caseUnion All三次,对于A1 A2,B1 B2,C1 C2等。

2 个答案:

答案 0 :(得分:0)

使用cross apply(values ...)和条件聚合:

select 
    v.X
  , Jan = max(case when t.month=1 then v.Value end)
  , Feb = max(case when t.month=2 then v.Value end)
  , Mar = max(case when t.month=3 then v.Value end)
from t
  cross apply(values
    ('A',convert(varchar(3),A1)+'/'+convert(varchar(3),A2))
   ,('B',convert(varchar(3),B1)+'/'+convert(varchar(3),B2))
   ,('C',convert(varchar(3),C1)+'/'+convert(varchar(3),C2))
  ) v (X,Value)
group by v.X

rextester演示:http://rextester.com/XICI74484

返回:

+---+---------+-------+-------+
| X |   Jan   |  Feb  |  Mar  |
+---+---------+-------+-------+
| A | 120/60  | 50/50 | 50/25 |
| B | 40/80   | 40/20 | 40/10 |
| C | 120/120 | 60/30 | 90/30 |
+---+---------+-------+-------+

评估表达式:

select 
    v.X
  , Jan = max(case when t.month=1 then v.Value end)
  , Feb = max(case when t.month=2 then v.Value end)
  , Mar = max(case when t.month=3 then v.Value end)
from t
  cross apply(values
    ('A',(A1*1.0)/A2)
   ,('B',(B1*1.0)/B2)
   ,('C',(C1*1.0)/C2)
  ) v (X,Value)
group by v.X

返回:

+---+------+------+------+
| X | Jan  | Feb  | Mar  |
+---+------+------+------+
| A | 2.00 | 1.00 | 2.00 |
| B | 0.50 | 2.00 | 4.00 |
| C | 1.00 | 2.00 | 3.00 |
+---+------+------+------+

答案 1 :(得分:0)

您可以使用XML。此代码段可能比您想要的更多,但它显示了

的方式
<button id="bt1" class="btn btn-default" >Confirmation 1</button>