2013-02-16 2 views
2

상황 : 3 소스 테이블 :여러 행의 특정 필드를 한 행의 여러 다른 필드로 "통합"하는 방법은 무엇입니까?

1 사용자 (고유 ID 함유 firstName과 같은 사용자 별 특성, givenName, StreetAddress 등) (고유 함유

2 MigrationFeatures ID 및 Feature_Name)

3. Link_Users_and_Features (고유 ID UsersFeatures뿐만 아니라 행의 Status 컬럼 (INT)) 링크 테이블에서

, 유저마다 거기 Feature 테이블의 행이 정확히만큼의 행은 사용자마다 각 행() 정확히 Feature에 연결됩니다. 각 링크 행에는 특정 값의 특정 사용자에 대한 특정 Feature의 마이그레이션 상태에 따라 다른 값을 가질 수있는 상태 값 열이 포함되어 있습니다.

목표 :

특정 사용자에 대한 각 Feature의 이동 상태와 각각의 사용자에 대해 하나 개의 행을 반환 완전 동적 u/SP를 갖는 - 각각의 이전 상태 항목은 Feature_Name 따라 명명 마땅한 Features 표의 해당 Feature에서 FeatureFeature 테이블에 추가 할 때 원하는 쿼리 코드를 수동으로 수정하지 않아야합니다.

힌트 : Feature 테이블에는 각 사용자에 대해이 추가 열을 생성하고 관련 열에 참조 무결성이 있으므로 모든 사용자가 항상 Features에 대한 링크 테이블의 모든 해당 행을 갖게됩니다. 지금까지, 나는 하나 개의 테이블은 모든 사용자 별 열 (Name, givenName, StreetAddress, 등)뿐만 아니라 모든 마이그레이션 기능 상태 열 (SIDhist migrated, homefolder migrated, 등)를 포함해야

:

왜 그렇게 갖고 싶어 할 모든 사용자의 모든 이전 상태 데이터 보유.

불행히도 이것은 완전히 정적이며 Feature을 새로 추가 할 때마다이 마스터 테이블을 수정해야합니다. 장래에 덜 숙련 된 사용자는 기본 시스템을 사용할 것이며 그들은 DB 코드 나 스키마에 들어 가지 않고 Featureuser 테이블에 레코드 만 추가합니다.여기

사용자의 DB 생성하는 코드 다음은 기능 테이블을 생성하는 코드

CREATE TABLE [dbo].[Users](
     [Users_ID] [int] IDENTITY(1,1) NOT NULL, 
     [FMOUser_givenName] [nvarchar](max) NULL, 
     [FMOUser_sn] [nvarchar](max) NULL, 
     [FMOUser_streetAddress] [nvarchar](max) NULL, 
     [ExcludeFromMigration] [bit] NULL, 
    CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
    (
     [Users_ID] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] 

    GO 

을 :

CREATE TABLE [dbo].[link_Users__with__Features](
    [link_Users__with__Features_ID] [int] IDENTITY(1,1) NOT NULL, 
    [FMO_Users_ID] [int] NOT NULL, 
    [Features_Migration_Core_ID] [int] NOT NULL, 
    [StatusValue] [int] NOT NULL, 
    [Description] [nvarchar](max) NULL, 
CONSTRAINT [PK_link_Users__with__Features] PRIMARY KEY CLUSTERED 
(
    [link_Users__with__Features_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
:

CREATE TABLE [dbo].[Features](
    [Features_ID] [int] IDENTITY(1,1) NOT NULL, 
    [Feature_Name] [nvarchar](max) NOT NULL 
CONSTRAINT [PK_Features] PRIMARY KEY CLUSTERED 
(
    [Features_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

링크 테이블을 생성하는 코드를

나는 이미 무엇을 연구 했습니까?

나는 다음과 같은 예를 발견 :이 하나의 단일 행에 새 열 이름으로 여러 행에서 하나의 열을 넣어 않습니다

http://www.dbforums.com/microsoft-sql-server/1673127-view-multiple-records-single-row.html

을하지만 동적이지 - 의미가 잡아 당기지 않는다 Features 테이블의 해당하는 "Feature"행에서 대상 열 이름을 대상으로 지정하거나 Features의 동적 번호를 처리 할 수 ​​없습니다.

저는 T-SQL에 비교적 익숙하지 않기 때문에이 문제를 해결하는 방법을 놓쳤습니다.

스택 오버플로에 대한 첫 번째 질문이므로 형식을 놓친 경우 용서해주세요. 나를 교정하고 잘 할 것입니다 :-)

힌트 : 제 질문에 제안 된 "중복"을 찾았지만 내 질문에 약간 일치하는 것도 없었습니다.

+1

, 'SQL 서버 동적 pivot'는 키워드가 웹 또는 위해 특별히 사이트 중 하나를 검색 할 수 있어야합니다. –

+0

고마워, 그것은 나를 올바른 방향으로 이끌었다. –

답변

0

다음 코드는 내 최초의 질문에 필요한 것을 수행합니다 (I가 추가 뷰 도입 한 점에 유의하시기 바랍니다 : view_Users_ _StatusValues ​​함께 사용자, 링크 테이블과 기능을 결합)

그것은 영감을 에서 : http://www.mssqltips.com/sqlservertip/2783/script-to-create-dynamic-pivot-queries-in-sql-server/

코드 : 그것의 모습에서

use [your_database] 

-- *** Get the column names for the target 'table' out from the features table 
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); 
SET @columns = N''; 
SELECT @columns += N',' + QUOTENAME(Feature_Name) 
    FROM (SELECT p.Feature_Name FROM dbo.Features AS p 
    INNER JOIN dbo.link_Users__with__Features AS o 
    ON p.Features_ID = o.Features_ID 
    GROUP BY p.Feature_Name) AS x; 

-- *** remove unneccessary, leading ',' *** 
set @columns = STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') 
-- print @columns 

-- *** Create the SQL code which will produce the correct output table *** 
SET @sql = N' 
select * from dbo.view_FMO_Users__and__StatusValues 
pivot(
     max(StatusValue) -- use any aggregate function (needed for pivoting) 
     for Feature_Name in (' + @columns + ')) as FeatureStatusValue' 

-- PRINT @sql; 
EXEC sp_executesql @sql; 
관련 문제