2011-12-29 42 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到內使用樞軸功能按要求格式化。