2011-12-29 19 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

あなたは何をしますか? – sq33G

+0

同じことを除いて、2つのコードの代わりに3つの異なるコードがあります。 – JohnDoe4136

+0

グループごとに異なる行を横に並べて表示しようとしていますか? data1に7-8の異なる行があり、data2に1〜2のレコードがある場合のシナリオを与えます。 –

答えて

3

これはSQLでのみ実行できますか?

可変数の列では、クエリを動的に構築する必要があります。 私はこの「SQLのみ」と呼ぶことはほとんどありませんが、T-SQLで行うことができます。ここでは1つの方法です。

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

ここで試してみてください:同じ `name`の下の3つのレコードがあった場合http://data.stackexchange.com/stackoverflow/q/122860/

0

正確ではありません。あなたは、多くのコード、数のペアを各レコードの単一の値に連結するというアイデアでハックすることができます。たとえそのようなことが可能であったとしても、同じ名前の複数の列を使って何をする予定ですか。

+0

これを行うことができるかもしれないASPコードはありますか? – JohnDoe4136

+0

これは別の質問です:)しかし、一般的には、同じ名前の複数の列と動的な列数を持つという問題を回避する必要があります。 – sq33G

1

あなたがのSQLServerを使用している、あなたがそうのように、名前のグループと各コードに連番を割り当てるためにランクを使用したと仮定すると:

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

次にあなたがSQLServerのか、SSRSのいずれかの中にピボット機能を使用することができますこれを必要に応じてフォーマットします。

関連する問題