【问题标题】:How can I transpose SQL Server rows to multiple column?如何将 SQL Server 行转换为多列?
【发布时间】:2017-05-26 17:18:11
【问题描述】:

如何将 SQL Server 的一行数据转换为多列?我有如下所示的数据

     [STOCK NO]        [PN1]           [PN2]             [PN3]         [PN4]                          [PN4]          [PN5]         [PN6]       [PN7]       [PN8]                    [PN9]   [PN10]  [PN11]   [PN12]    [Qty] 
    700349L           600446            201743           100208                                      300219          400533                  100280        100218                   100222          100220    100221      1

我想看看这样的东西

[STOCK NO]        [bomRev]      [bomEntry]  [partId] [qty]  [cmnt]  [srcLoc]    [dType]    [lead]   [lineNbr]
700349L             A               1         600446  1      `TEST`   TEST       0           0       1
700349L             A               2         201743  1      `TEST`   TEST       0           0       2
700349L             A               3         100208  1      `TEST`   TEST       0           0       3
700349L             A               4         300219  1      `TEST`   TEST       0           0       4

700349L             A               5         400533  1       `TEST`   TEST       0           0       5

700349L             A               6         100218  1       `TEST`   TEST       0           0       6
700349L             A               7         100222  1       `TEST`   TEST       0           0       7
700349L             A               8         100220  1       `TEST`   TEST       0           0       8
700349L             A               9         100221  1       `TEST`   TEST       0           0       9

然后我想使用 select 语句中的插入,如下所示,但我喜欢将行转置为多列

 INSERT INTO [DT]([bomItem], [bomRev], [bomEntry], [partId], [qty], [cmnt],[srcLoc], [dType], [lead], [lineNbr])
     SELECT 
         [STOCK NO], 'A', [bomEntry], [partid], [qty], 'TEST', 'TEST', '0', '0', [lineNbr]
     FROM 
         [ST] 

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

这使用问题中其他编辑之前的列和示例数据。

使用cross apply() 取消透视您的列,并使用row_number() 仅对具有值的行编号:

--INSERT INTO [DT]([bomItem], [bomRev], [bomEntry], [partId], [qty], [cmnt],[srcLoc], [dType], [lead], [lineNbr])
select 
    st.[CALC STOCK NO]    
  , bomRev = 'A'
  , bomEntry = row_number() over (order by u.ordinal)
  , u.Partid
  , st.Qty
  , cmnt = 'Test'
  , srcLoc = 'Test'
  , dType = '0'
  , lead = '0'
  , lineNbr = row_number() over (order by u.ordinal)
from st
  cross apply (values 
     (1,[BOM WHEEL PN])
    ,(2,[BOM TIRE PN])
    ,(3,[BOM VALVE PN])
    ,(4,[BOM - SECONDARY DISC PN])
    ,(5,[BOM - DISC])
    ,(6,[BOM - RIM])
    ,(7,[BUY WHEEL])
    ,(8,[COLOR PN])
    ,(9,[WHL BOM PART 1 PN])
    ,(10,[WHL BOM PART 2 PN])
    ,(11,[WHL BOM PART 3 PN])
    ,(12,[WHL BOM PART 4 PN])
    ,(13,[WHL BOM PART 5 PN])
) u (ordinal, partId)
where nullif(u.partId,'') is not null

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

返回:

+---------------+--------+----------+--------+-----+------+--------+-------+------+---------+
| CALC STOCK NO | bomRev | bomEntry | Partid | Qty | cmnt | srcLoc | dType | lead | lineNbr |
+---------------+--------+----------+--------+-----+------+--------+-------+------+---------+
| 700349L       | A      |        1 | 600446 |   1 | Test | Test   |     0 |    0 |       1 |
| 700349L       | A      |        2 | 201743 |   1 | Test | Test   |     0 |    0 |       2 |
| 700349L       | A      |        3 | 100208 |   1 | Test | Test   |     0 |    0 |       3 |
| 700349L       | A      |        4 | 300219 |   1 | Test | Test   |     0 |    0 |       4 |
| 700349L       | A      |        5 | 400533 |   1 | Test | Test   |     0 |    0 |       5 |
| 700349L       | A      |        6 | 100280 |   1 | Test | Test   |     0 |    0 |       6 |
| 700349L       | A      |        7 | 100218 |   1 | Test | Test   |     0 |    0 |       7 |
| 700349L       | A      |        8 | 100222 |   1 | Test | Test   |     0 |    0 |       8 |
| 700349L       | A      |        9 | 100220 |   1 | Test | Test   |     0 |    0 |       9 |
| 700349L       | A      |       10 | 100221 |   1 | Test | Test   |     0 |    0 |      10 |
+---------------+--------+----------+--------+-----+------+--------+-------+------+---------+

【讨论】:

  • 非常感谢!!两件事 1. 我可以使用插入的表来创建触发器吗? 2.我如何忽略/跳过空白部分我添加了图像来显示
  • @user8066749 更新了我的答案,以使用nullif(u.partId,'') is not null 而不仅仅是u.partid is not null 从结果中删除空字符串。我还在查询之前添加了一个注释掉的 insert 语句,您可以使用它来插入您正在描述的表中。
  • 完美!谢谢!
  • @user8066749 乐于助人!
【解决方案2】:

Pivot 应该适合您。
查看此链接:https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx
如果您发布足够多的虚拟数据,有人将能够帮助您完成查询。您可以利用 http://rextester.com/ 之类的东西来共享虚拟数据。
祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2015-12-04
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多