我目前在SQL服务器上遇到了一个问题,而且我可能对自动化某些程序的可扩展性知之甚少。所以我想知道以下是否可行:
我有一张桌子,说:
AR_Code CD_code CO_Code Centre Cost
AL 3F2 811 ops floc
AL 3D2 812 ops cell
理想情况下,我希望以下列格式获取它,它可以根据可用字段的数量进行动态移动:
AR_Code CD_code CO_Code Centre Cost
AL NULL NULL NULL NULL
AL 3F2 NULL NULL NULL
AL 3F2 811 NULL NULL
AL 3F2 811 ops NULL
AL 3F2 811 ops floc
AL NULL NULL NULL NULL
AL 3D2 NULL NULL NULL
AL 3D2 812 NULL NULL
AL 3D2 812 ops NULL
AL 3D2 812 ops cell
它几乎在字段之间创建了一个步骤。一些会计软件包也可以存储数据。我目前的方法是一场噩梦,它涉及工会,同时非常不可扩展:
SELECT
AR
,NULL as [CD code]
,NULL as [CO Code]
,NULL as [Centre ]
,NULL as [Cost ]
FROM Table
UNION ALL
SELECT
AR
,CD code as [CD code]
,NULL as [CO Code]
,NULL as [Centre ]
,NULL as [Cost ]
FROM Table
etc...
我不确定是否有人遇到过这个问题,或者有一个聪明的方法来解决这个问题 - 我可以稍后再担心订单,但我的主要问题是:
感谢。
-R
答案 0 :(得分:1)
您可以使用APPLY
运算符将值转置为您要查找的形状。您描述的形状需要N
子句中的APPLY
行,其中N
是所涉及的列数。从完整行开始,我们只需迭代N - 1
次,并在每次迭代中创建一个新列null
:
0. (AR_Code, CD_code, CO_Code, Centre, Cost)
1. (AR_Code, CD_code, CO_Code, Centre, null)
...
4. (AR_Code, null, null, null, null)
通过这种结构,我们可以简单地APPLY
原始表中每一行的逻辑。
select b.*
from (values
(N'AL', N'3F2', N'811', N'ops', N'floc')
, (N'AL', N'3D2', N'812', N'ops', N'cell')
) as a (AR_Code, CD_code, CO_Code, Centre, Cost)
cross apply (values
(a.AR_Code, null, null, null, null)
, (a.AR_Code, a.CD_code, null, null, null)
, (a.AR_Code, a.CD_code, a.CO_Code, null, null)
, (a.AR_Code, a.CD_code, a.CO_Code, a.Centre, null)
, (a.AR_Code, a.CD_code, a.CO_Code, a.Centre, a.Cost)
) as b (AR_Code, CD_code, CO_Code, Centre, Cost);
这应该在一次传递中发生,你在这里所做的一切都是通过将a
中的行乘以b
中的行来改变原始集的基数。