2012-07-05 2 views
0

테이블 2 개, tblClient 및 tblDB가 있습니다.내부 피벗 SQL

CREATE TABLE tblBD(
[ID] INT PRIMARY KEY, 
[DataBase] nVARCHAR (30) NOT NULL, 
[ClientID] INT NOT NULL, 
FOREIGN KEY ([ClientID]) REFERENCES tblClient(ID) 
) 

CREATE TABLE tblClient(
[ID] INT PRIMARY KEY, 
[Name] nVARCHAR(30), 
[Status] BIT, 
[Number] INT, 
) 

저는 모든 클라이언트에 대해 모든 데이터베이스를 가져오고 싶습니다. 이 같은

뭔가 :

Client1 Client2 ClientX 
BD1  BD1  BD1 
BD2  BD2  BD2 
BDX  BDX  BDX 

나는이 스크립트를 실행하여 하나의 클라이언트를 위해 쉽게 작업을 수행 할 수 있습니다,

Select tblBD.[DataBase] from tblBD 
inner join tblCLient on tblBD.ClientID = tblClient.ID Where tblClient.ID = 1234 

을하지만 모든 클라이언트에 대한 결과를 얻을 방법을 알아낼 수 없습니다 1 테이블.

피벗의 경우 집계 함수를 사용하지 않으면 결과를 얻을 수 없습니다.

예 :

나는 집계 함수를 사용하지 않고 모든 데이터베이스를 얻고 싶은
WITH T 
AS (Select tblBD.[DataBase] as BD, tblClient.ID as ClientID from 
tblBD inner join tblCLient on tblBD.ClientID = tblClient.ID) 
SELECT * 
FROM T PIVOT ( 
max (BD) FOR ClientID IN ([1],[2],[3], [4]) 
) AS pvt 

. 모든

+0

PIVOT을 사용하여이 작업을 수행 할 수 있지만 헤더에 클라이언트 이름의 하드 코딩 된 목록이 필요하거나 동적 SQL 또는 응용 프로그램 언어로 동적으로 목록을 생성해야합니다. 데이터베이스 대신 응용 프로그램의 데이터를 레이아웃 할 수 있습니까? – mellamokb

+0

문제는 in n 클라이언트를 가질 수 있다는 것입니다. 그래서 나는 그것을 harcode 수 없습니다. 나는 vb.net에서 그것을 Codding입니다. 내 응용 프로그램 전체 테이블을 제공하는 것을 선호합니다. 내 응용 프로그램에서 각 클라이언트를 관리하고 싶지 않습니다. – billybob

+0

예 매우 일반적인 문제입니다. 이미 많은 비슷한 질문/해결책이 있어야합니다. – mellamokb

답변

1

먼저, 나는이에서 영감을 얻었다 :

http://www.sqlmag.com/article/tsql3/pivoting-without-aggregation

는 클라이언트의 수를 얻기 위해이 스크립트를 실행 : 당신이 원하는대로

SELECT COUNT(DISTINCT tblBD.ClientID) FROM tblBD 

후 많은 고객을 만들 수 있습니다. 내 경우에는 4 클라이언트와

예 :

SELECT [1] AS Client1, [2] AS Client2, [3] AS Client3, [4] AS Client4 
FROM 
(
    Select tblBD.[DataBase] AS BD, 
    tblBD.ClientID AS ClientID , 
    ROW_NUMBER() OVER (PARTITION BY ClientID ORDER BY ClientID) AS RowNum 
    FROM tblBD 
) Piv 
PIVOT (MAX(BD) FOR ClientID IN ([1],[2],[3], [4])) AS pvt 

당신은 당신의 코드에서 당신이 원하는만큼의 클라이언트를 포함하는 쿼리 문자열을 구축 할 수 있습니다.