以步骤格式构造SQL表

时间:2016-10-26 13:50:35

标签: sql-server

我目前在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

1 个答案:

答案 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中的行来改变原始集的基数。