SQL 服务器:使用动态数据透视将值排序到 LIKE 列中
SQL Server: sort values Into LIKE columns with dynamic pivot
版本:Microsoft SQL Server 2014
我已经成功创建了一个动态数据透视表 table(在帮助下),现在我对列名及其值有疑问。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT distinct ','
+ QUOTENAME('Component_' + cast(rn as varchar(10)))
FROM dbo.table
CROSS APPLY
(SELECT row_number() over(partition by UPC order by ComponentNum) rn
FROM dbo.table) x
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @query = 'SELECT UPC, ' + @cols + ' FROM
(
SELECT UPC, ComponentNum,
''Component_''
+ cast(row_number() over(partition by UPC order by ComponentNum) as varchar(10)) val
FROM dbo.table) x
PIVOT
(
MAX(ComponentNum)
FOR val IN (' + @cols + ')
) p '
execute(@query)
table 旋转后,它创建了 27 列 Component_X
。
27 列应该代表与唯一 UPC 编号相关联的不同种类的部件。并非所有 UPC 都有 27 种零件。
似乎根据行号,UPC 编号的分区组中列出的部件是它在数据透视列中分配的位置。
这表明我需要在 运行 主元之前对原始数据进行排序,不是吗?查看下面的结果 table,您可以看到部件号 543
显示在 Component_13
、Component_1
和 Component_10
下,用于不同的 UPC 编号。
ID UPC Component_13 Component_1 Component_10
------------------------------------------------------------------------
1 123 543 NULL 345
2 321 345 543 765
3 213 654 345 NULL
4 312 765 NULL 543
我的问题是我不能让部件号在不同的列之间浮动。如果部件号是 "Component_13"
类型,则需要保留在该列中。
我的目标是让 Component_X
的每次迭代都代表一种特定的零件。
Component_1 = Bolts
Component_2 = Nuts
Component_3 = Washers
另一个问题是我还需要将多个 "Bolt" 零件号枚举到它们自己的列中,以便由另一个软件检索。
任何 UPC 编号都可以有任意数量的 "Bolts" 不同尺寸和不同零件号。
最终结果 table 可能如下所示:
ID UPC Bolt1 Bolt2 Bolt3 Nut1 Nut2
------------------------------------------------------------------------
1 123 1.5 1 NULL 0.5 .375
2 321 2.0 NULL NULL .625 NULL
3 213 0.25 .875 .375 NULL NULL
4 312 NULL NULL NULL 1.25 .625
这可能是不可能的,但我不得不问是否有人可以提供解决方案。
您可以使用 REPLICATE 生成一个可以轻松订购的两位或更多位数字。
create table test(rn varchar(10));
insert into test
values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('10'), ('11'), ('12');
select num
from
(select 'Component_' + replicate('0', 2 - len(rn)) + rn as num
from test) x
order by num;
结果:
| num |
| :----------- |
| Component_01 |
| Component_02 |
| Component_03 |
| Component_04 |
| Component_05 |
| Component_06 |
| Component_07 |
| Component_08 |
| Component_09 |
| Component_10 |
| Component_11 |
| Component_12 |
dbfiddle here
版本:Microsoft SQL Server 2014
我已经成功创建了一个动态数据透视表 table(在帮助下),现在我对列名及其值有疑问。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT distinct ','
+ QUOTENAME('Component_' + cast(rn as varchar(10)))
FROM dbo.table
CROSS APPLY
(SELECT row_number() over(partition by UPC order by ComponentNum) rn
FROM dbo.table) x
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @query = 'SELECT UPC, ' + @cols + ' FROM
(
SELECT UPC, ComponentNum,
''Component_''
+ cast(row_number() over(partition by UPC order by ComponentNum) as varchar(10)) val
FROM dbo.table) x
PIVOT
(
MAX(ComponentNum)
FOR val IN (' + @cols + ')
) p '
execute(@query)
table 旋转后,它创建了 27 列 Component_X
。
27 列应该代表与唯一 UPC 编号相关联的不同种类的部件。并非所有 UPC 都有 27 种零件。
似乎根据行号,UPC 编号的分区组中列出的部件是它在数据透视列中分配的位置。
这表明我需要在 运行 主元之前对原始数据进行排序,不是吗?查看下面的结果 table,您可以看到部件号 543
显示在 Component_13
、Component_1
和 Component_10
下,用于不同的 UPC 编号。
ID UPC Component_13 Component_1 Component_10
------------------------------------------------------------------------
1 123 543 NULL 345
2 321 345 543 765
3 213 654 345 NULL
4 312 765 NULL 543
我的问题是我不能让部件号在不同的列之间浮动。如果部件号是 "Component_13"
类型,则需要保留在该列中。
我的目标是让 Component_X
的每次迭代都代表一种特定的零件。
Component_1 = Bolts
Component_2 = Nuts
Component_3 = Washers
另一个问题是我还需要将多个 "Bolt" 零件号枚举到它们自己的列中,以便由另一个软件检索。 任何 UPC 编号都可以有任意数量的 "Bolts" 不同尺寸和不同零件号。
最终结果 table 可能如下所示:
ID UPC Bolt1 Bolt2 Bolt3 Nut1 Nut2
------------------------------------------------------------------------
1 123 1.5 1 NULL 0.5 .375
2 321 2.0 NULL NULL .625 NULL
3 213 0.25 .875 .375 NULL NULL
4 312 NULL NULL NULL 1.25 .625
这可能是不可能的,但我不得不问是否有人可以提供解决方案。
您可以使用 REPLICATE 生成一个可以轻松订购的两位或更多位数字。
create table test(rn varchar(10));
insert into test
values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('10'), ('11'), ('12');
select num
from
(select 'Component_' + replicate('0', 2 - len(rn)) + rn as num
from test) x
order by num;
结果:
| num |
| :----------- |
| Component_01 |
| Component_02 |
| Component_03 |
| Component_04 |
| Component_05 |
| Component_06 |
| Component_07 |
| Component_08 |
| Component_09 |
| Component_10 |
| Component_11 |
| Component_12 |
dbfiddle here