2012-07-05 134 views
0

我有2個表,tblClient和tblDB。Inner Join Pivot 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 2012-07-05 15:18:20

+0

問題是可以有n個客戶。所以我無法對它進行編碼。我在vb.net中對它進行了編碼。我更願意將我的應用程序放在整個表格中。我不想爲我的應用程序中的每個客戶端進行管理。 – billybob 2012-07-05 15:19:32

+0

是的,這是一個非常普遍的問題。 SO上應該有許多類似的問題/解決方案。 – mellamokb 2012-07-05 15:20:39

回答

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 

你可以在你的代碼生成一個查詢字符串作爲你想要將包含儘可能多的客戶。