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

+0

두 개가 아닌 세 개의 다른 코드가있는 것을 제외하고는 똑같은 것입니다. – JohnDoe4136

+0

그룹별로 다른 행을 가로로 나열하려고합니까? data1에 7-8 개의 다른 행이 있고 data2에 1-2 개의 레코드가있는 경우 시나리오를 제공하십시오. –

답변

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

정확하게는 아닙니다. 하지만 각 레코드에 대해 Code, Qty 쌍을 하나의 값으로 연결하는 아이디어로 해킹 할 수 있습니다. 같은 이름을 가진 여러 열을 사용하여 수행 할 계획이 있는지 확신 할 수 없습니다.

+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에 하나 내에서 피벗 기능을 사용할 수 있습니다 이것을 필요에 따라 포맷하십시오.