我想用SQL分组相同的记录,以下是我的结果
Name Code Qty
data1 AG 12
data1 AS 15
data2 MS 10
data2 IS 11
我希望它能像这样。
Name Code Qty Code Qty
data1 AG 12 AS 15
data2 MS 10 IS 11
这可以仅在SQL中完成吗?
答案 0 :(得分:3)
这可以仅在SQL中完成吗?
使用可变数量的列,您必须动态构建查询。 我很难称之为“仅SQL”,但它可以在T-SQL中完成,这是一种方式。
-- Sample table
declare @T table
(
Name varchar(5),
Code varchar(2),
Qty int
)
-- Sample data
insert into @T values
('data1', 'AG', 12),
('data1', 'AS', 15),
('data1', 'AQ', 17),
('data2', 'MS', 10),
('data2', 'IS', 11)
declare @XML xml
declare @SQL nvarchar(max)
declare @Max int
-- Max number of codes per name
select @Max = max(C)
from (select count(*) as C
from @T
group by Name) as T
-- Convert table to XML
set @XML = (select Name,
(select Code,
Qty
from @T as T2
where T1.Name = T2.Name
for xml path('c'), type)
from @T as T1
group by Name
for xml path('r'))
-- Build a dynamic query
;with Numbers(Number) as
(
select 1
union all
select Number + 1
from Numbers
where Number < @Max
)
select @SQL = 'select T.N.value(''Name[1]'', ''varchar(5)'') as Name ' +
(select ',T.N.value(''c['+cast(Number as nvarchar(10))+']/Code[1]'', ''char(2)'') as Code
,T.N.value(''c['+cast(Number as nvarchar(10))+']/Qty[1]'', ''int'') as Qty'
from Numbers
for xml path(''), type).value('.', 'nvarchar(max)') +
' from @xml.nodes(''/r'') as T(N)'
-- Execute query
exec sp_executesql @SQL, N'@xml xml', @XML
结果:
Name Code Qty Code Qty Code Qty
----- ---- ----------- ---- ----------- ---- -----------
data1 AG 12 AS 15 AQ 17
data2 MS 10 IS 11 NULL NULL
答案 1 :(得分:1)
假设您正在使用SQLServer,您可以使用rank为每个具有名称组的代码分配一个序列号,如下所示:
select Name, Code, Qty, Rank() OVER (PARTITION BY Name ORDER BY Code) AS CodeRank
from MyTable
然后,您可以使用SQLServer或SSRS中的数据透视功能根据需要对其进行格式化。
答案 2 :(得分:0)
不完全是。但是,你可以解决将大量Code,Qty对连接到每个记录的单个值的想法。我不确定你打算用多个具有相同名称的列做什么,即使这样的事情是可能的。