2011-12-29 12 views
0

我想与SQL组相同的记录,下面是我的结果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

你会怎么做,如果有下一样'Name'三个记录? – sq33G 2011-12-29 08:44:24

+0

同样的事情,除了会有三个不同的代码而不是两个等等。 – JohnDoe4136 2011-12-29 08:56:18

+0

你是否试图列出水平不同的行按组?如果data1具有7-8个不同的行并且data2具有1-2个记录,则提供场景。 – 2011-12-29 09:35:25

回答

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/

0

不完全。不过,您可以尝试将大量代码,数量对连接成每个记录的单个值。我不确定你打算如何处理多个同名的列,即使这样的事情是可能的。

+0

有没有可以做到这一点的asp代码? – JohnDoe4136 2011-12-29 09:21:28

+0

这是另一个问题:) - 但通常情况下,您仍然需要解决具有多个具有相同名称的列和动态数量的列的问题。 – sq33G 2011-12-29 09:27:30

1

假设使用的是SQLServer的,可以使用秩到顺序号分配给具有名称组的各代码,例如:

select Name, Code, Qty, Rank() OVER (PARTITION BY Name ORDER BY Code) AS CodeRank 
from MyTable 

然后,你可以SQLServer的或SSRS到内使用枢轴功能按要求格式化。

相关问题