Sql server 以step格式构造SQL表

Sql server 以step格式构造SQL表,sql-server,Sql Server,我目前在SQL server中面临一个问题,我可能不太了解它在自动化某些过程方面的可伸缩性。因此,我想知道以下是否可行: 我有一张桌子,说: AR_Code CD_code CO_Code Centre Cost AL 3F2 811 ops floc AL 3D2 812 ops cell 理想情况下,我希望它采用以下格式,在这种格式中,它可以具有足够的动态性,可以根据可用字段的数量进行移动: AR_Code CD_cod

我目前在SQL server中面临一个问题,我可能不太了解它在自动化某些过程方面的可伸缩性。因此,我想知道以下是否可行:

我有一张桌子,说:

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

您可以使用
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)
通过这种构造,我们可以简单地
将逻辑应用于原始表中的每一行

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
中的行来更改原始集合的基数。我认为您的方法没有任何问题。速度慢吗?您需要构建这样的报告还是修改存储这些数据的方式?这是一次性任务吗?使用虚拟聚合可能会有所帮助。在前两个阶段,它并不慢,只是单调乏味。特别是如果我想扩大规模的话。i、 e.在一周内再增加5列,然后在下一周减少。这将导致结构发生变化。。其次,它需要成为存储数据的一种方式,因为第三方技术需要导入数据的特定结构@Jeroemostert我会调查一下并告诉你最新情况。谢谢你!