SQL组记录具有相同的值,并将其放入表中

时间:2011-12-29 08:37:10

标签: sql sql-server

我想用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中完成吗?

3 个答案:

答案 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

在此尝试:http://data.stackexchange.com/stackoverflow/q/122860/

答案 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对连接到每个记录的单个值的想法。我不确定你打算用多个具有相同名称的列做什么,即使这样的事情是可能的。