2012-05-16 223 views
0

我想創建一個動態的樞軸,但似乎無法讓它工作。樞軸和過濾器

表:

SELECT [CaseID], [ClientID] 
from [RegData] 

目前返回:

CaseID--|ClientID| RecID 
------------------------ 
7845107 |115172 |410 
7845107 |164570 |1197 
7845107 |115655 |416 
7845107 |154244 |425 
7856846 |116684 |151 
7856846 |112354 |445 
7455444 |115172 |492 
7455444 |164570 |518 
7455444 |115655 |1297 
7455444 |154244 |681 

我需要回到這樣的:

CaseID--|Val1----|Val2----|Val3----|Val4----| 
7845107 |115172 |164570 |115655 |154244 | 
7856846 |116684 |112354 |  |  | 
7455444 |115172 |164570 |115655 |154244 | 

然後,我需要找到CaseID是不同的情況下,但是VAL1,VAL2,VAL3等都是一樣的。

CaseID--|Val1----|Val2----|Val3----|Val4----| 
7845107 |115172 |164570 |115655 |154244 | 
7455444 |115172 |164570 |115655 |154244 | 
+0

您如何認定164570是Val2而115655是Val3? SQL Server需要某種數據支持的方式(或者可以引入查詢的確定性)來支持該順序。你在這裏的查詢沒有ORDER BY,所以我懷疑你認爲這是因爲這次數據返回的方式,這是它總是返回的順序?這是一種常見的誤解,但它仍然是一種誤解。你是否有另一個欄目可以幫助決定你的預期訂購(例如身份或日期/時間欄)? –

+0

嗨亞倫,很公平點。爲了減少混亂,我省略了'RecID'列,它實際上是每行的唯一標識符。 – Rya

+0

那麼在您的示例中按照RecID排序的那些行?通常我們更喜歡充分的信息......我們聰明的人和混亂通常不會讓我們放慢太多。所以我建議你至少在第一組中添加RecID值。 –

回答

1

這裏有很多免責聲明。依靠你只關心所有4個值都很重要的情況。如果其中一個案例的第5個客戶不匹配,或者同一組客戶的案例超過兩個,我沒有測試會發生什麼情況。它適用於您提供的樣本數據,除了您期望在每個Value1/Value2列等中看到的值以不同於您的樣本輸出的順序呈現。

DECLARE @x TABLE(CaseID INT, ClientID INT); 

INSERT @x SELECT 7845107,115172 UNION ALL SELECT 7845107,164570 
UNION ALL SELECT 7845107,115655 UNION ALL SELECT 7845107,154244 
UNION ALL SELECT 7856846,116684 UNION ALL SELECT 7856846,112354 
UNION ALL SELECT 7455444,115172 UNION ALL SELECT 7455444,164570 
UNION ALL SELECT 7455444,115655 UNION ALL SELECT 7455444,154244; 

;WITH x AS 
(
    SELECT CaseID, ClientID, rn = ROW_NUMBER() OVER 
    (PARTITION BY CaseID ORDER BY ClientID) 
    FROM @x 
), 
y AS 
(
    SELECT x.CaseID, x.ClientID, x.rn 
    FROM x INNER JOIN x AS x2 
    ON x.CaseID <> x2.CaseID 
    AND x.ClientID = x2.ClientID 
    AND x.rn = x2.rn 
) 
SELECT CaseID, 
    Value1 = MAX(CASE WHEN rn = 1 THEN ClientID END), 
    Value2 = MAX(CASE WHEN rn = 2 THEN ClientID END), 
    Value3 = MAX(CASE WHEN rn = 3 THEN ClientID END), 
    Value4 = MAX(CASE WHEN rn = 4 THEN ClientID END) 
FROM y 
GROUP BY CaseID; 

結果:

CaseID Value1 Value2 Value3 Value4 
------- ------ ------ ------ ------ 
7455444 115172 115655 154244 164570 
7845107 115172 115655 154244 164570 
+0

似乎沒有編譯。 INSERT @x VALUES (7845107,115172),(7845107,164570), – Rya

+0

@Rya INSERT INTO @x(val1,val2)後,每行插入一行,然後對每個值重複INSERT INTO對。似乎sql 2005不能一次插入多個值,如果你得到一個錯誤。 – YvesR

+0

對不起@Rya,我錯過了SQL Server 2005標記(該語法在現代版本的SQL Server上是有效的)。當然,你也可以試着對你的表進行查詢,而不是反對'@ x' - 我只是用來證明它的工作方式就像你所要求的。 –

0

這是我想出了。效率不是很高,但它有效...

我創建了一張表。我碰巧知道他們不超過9個同樣的情況,因此Val9。

DECLARE 
    @totalRecords int, 
    @counter int, 
    @QueryCaseID int, 
    @QueryClientID int, 
    @queryVal1 int, 
    @queryVal2 int, 
    @queryVal3 int, 
    @queryVal4 int, 
    @queryVal5 int, 
    @queryVal6 int, 
    @queryVal7 int, 
    @queryVal8 int, 
    @queryVal9 int 

Set @totalRecords = (Select count(*) from RegData) +1 
Set @counter = 1 

-- Get the rows in the table and put them into the 'RegData_reformat' table 
While @counter < @totalRecords 
    Begin 

     -- get the CASEID to cross query to reformatted table 
     SET @QueryCaseID = (Select CaseID from RegData where RecID = @counter) 

     -- get the ClientId to cross query to reformatted table 
     SET @QueryClientID = (Select ClientID from RegData where RecID = @counter) 



     -- assign the columns to variables 
     SET @queryVal1 = (Select Val1 from RegData_reformat where CaseID = @QueryCaseID) 
     SET @queryVal2 = (Select Val2 from RegData_reformat where CaseID = @QueryCaseID) 
     SET @queryVal3 = (Select Val3 from RegData_reformat where CaseID = @QueryCaseID) 
     SET @queryVal4 = (Select Val4 from RegData_reformat where CaseID = @QueryCaseID) 
     SET @queryVal5 = (Select Val5 from RegData_reformat where CaseID = @QueryCaseID) 
     SET @queryVal6 = (Select Val6 from RegData_reformat where CaseID = @QueryCaseID) 
     SET @queryVal7 = (Select Val7 from RegData_reformat where CaseID = @QueryCaseID) 
     SET @queryVal8 = (Select Val8 from RegData_reformat where CaseID = @QueryCaseID) 
     SET @queryVal9 = (Select Val9 from RegData_reformat where CaseID = @QueryCaseID) 


     --determine which column to insert the data into 


-- Insert the data into the formatted table 

     IF @queryVal1 IS NULL 
      BEGIN 
       UPDATE [4DISCSReporting].[dbo].[RegData_reformat] 
       SET [Val1] = @QueryClientID 
       WHERE CaseID = @QueryCaseID 
      END 

    -- Column 2 test 
     else IF @queryVal2 IS NULL 
      BEGIN 
       UPDATE [4DISCSReporting].[dbo].[RegData_reformat] 
       SET [Val2] = @QueryClientID 
       WHERE CaseID = @QueryCaseID 
      END 

    -- Column 3 test 
     else IF @queryVal3 IS NULL 
      BEGIN 
       UPDATE [4DISCSReporting].[dbo].[RegData_reformat] 
       SET [Val3] = @QueryClientID 
       WHERE CaseID = @QueryCaseID 
      END 

    -- Column 4 test 
     else IF @queryVal4 IS NULL 
      BEGIN 
       UPDATE [4DISCSReporting].[dbo].[RegData_reformat] 
       SET [Val4] = @QueryClientID 
       WHERE CaseID = @QueryCaseID 
      END 

    -- Column 5 test    
     else IF @queryVal5 IS NULL 
      BEGIN 

       UPDATE [4DISCSReporting].[dbo].[RegData_reformat] 
       SET [Val5] = @QueryClientID 
       WHERE CaseID = @QueryCaseID 
      END 

    -- Column 6 test 
     else IF @queryVal6 IS NULL 
      BEGIN 

       UPDATE [4DISCSReporting].[dbo].[RegData_reformat] 
       SET [Val6] = @QueryClientID 
       WHERE CaseID = @QueryCaseID 
      END 

    -- Column 7 test 
     else IF @queryVal7 IS NULL 
      BEGIN 

       UPDATE [4DISCSReporting].[dbo].[RegData_reformat] 
       SET [Val7] = @QueryClientID 
       WHERE CaseID = @QueryCaseID 
      END 

    -- Column 8 test 
     else IF @queryVal8 IS NULL 
      BEGIN 

       UPDATE [4DISCSReporting].[dbo].[RegData_reformat] 
       SET [Val8] = @QueryClientID 
       WHERE CaseID = @QueryCaseID 
      END 

    -- Column 9 test 
     else IF @queryVal9 IS NULL 
      BEGIN 

       UPDATE [4DISCSReporting].[dbo].[RegData_reformat] 
       SET [Val9] = @QueryClientID 
       WHERE CaseID = @QueryCaseID 
      END 



     ELSE 
      BEGIN 
       print 'Ran out of columns to enter data into' 
       Select 'FATAL ERROR: ran out of columns to enter data into' as Error 
      END 



    set @counter = @counter +1 


    END