2017-01-05 29 views
0

我有一張表,用於存儲帳戶ID和值。一個帳戶可以有多行,每行一個值。我想創建查詢,這將使我每個帳戶ID一行,每個值的列(具有3個值的限制)如何獲取多行數據到不同的列

數據表樣品:

AccountID        Value 
8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB 34CD2F7D-E146-457E-B524-298D15EE0063 
8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB 4FC58366-C797-4CAB-8A90-FE7425C1EDCD 
8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB 10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC    
02423075-6C7D-4AEB-AE8C-059E43914D53 8327537F-B0CB-43A4-B9BC-31E0A6377F99    
02423075-6C7D-4AEB-AE8C-059E43914D53 2EE12215-AF0D-4636-9E37-7F49EDA22AFF    
BEE8C007-ECA3-4327-8248-A1A66925EE9E 8FC3D058-0AC8-4295-A34D-28755DB52F54    

這裏是查詢我拿出這麼遠:

SELECT C1.AccountId, C1.Value Value1, C2.Value Value2, C3.Value Value3 
FROM 
TempTable C1 
JOIN 
TempTable C2 ON C2.AccountId = C1.AccountId AND C2.Value != C1.Value 
JOIN 
TempTable C3 ON C2.AccountId = C3.AccountId AND C3.AccountId = C1.AccountId AND C3.Value != C2.Value AND C3.Value != C1.Value 

這裏是我遇到了迄今爲​​止的問題:

  1. 當我運行查詢有一個賬戶我有150條記錄。如果我在select語句中放置一個DISTINCT,它會返回6條記錄。
  2. 當我運行不同時它會爲每個可能的組合創建一個行。我不DISTINCT照顧令值列是

輸出(只有一個賬戶 - 將有每個賬戶行):

AccountId          Value1          Value2          Value3 
8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB   34CD2F7D-E146-457E-B524-298D15EE0063  4FC58366-C797-4CAB-8A90-FE7425C1EDCD  10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC 
8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB   34CD2F7D-E146-457E-B524-298D15EE0063  10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC  4FC58366-C797-4CAB-8A90-FE7425C1EDCD 
8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB   4FC58366-C797-4CAB-8A90-FE7425C1EDCD  34CD2F7D-E146-457E-B524-298D15EE0063  10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC 
8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB   4FC58366-C797-4CAB-8A90-FE7425C1EDCD  10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC  34CD2F7D-E146-457E-B524-298D15EE0063 
8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB   10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC  34CD2F7D-E146-457E-B524-298D15EE0063  4FC58366-C797-4CAB-8A90-FE7425C1EDCD 
8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB   10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC  4FC58366-C797-4CAB-8A90-FE7425C1EDCD  34CD2F7D-E146-457E-B524-298D15EE0063 

所需的結果(只有一個帳戶 - 將有每個賬戶行):

AccountId        Value1         Value2         Value3 
8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB 34CD2F7D-E146-457E-B524-298D15EE0063 4FC58366-C797-4CAB-8A90-FE7425C1EDCD 10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC 
+0

這看起來類似PIVOT(您想行返回列)除了你基本上每個賬戶ID具有可變數量的列。 1有三列,2有兩列,3有一列,可能有4列有53列。由於給定的查詢必須爲每一行返回相同的模式,因此必須允許儘可能多的列數。這似乎不是一個理想的情況。也許需要重新考慮要求。 – pmbAustin

+0

@pmbAustin:如果應該總是有3列,有幫助嗎?如果少於這個數字,返回一個NULL,如果還有更多,只取前3個。 – ferensilver

+0

是的,這有幫助。這似乎是一個PIVOT的理想選擇。下面接受的答案是一種「手動支點」,這也可以...這是我在PIVOT/UNPIVOT可用之前總是做的。爲了將來的參考,像「每個ID最多三行」這樣的信息對於形成準確的答案非常有用。 – pmbAustin

回答

0

有很多資源的使用PIVOT和有條件的聚集,實現了支點。我更喜歡使用條件聚合,因爲它更清晰,更易於閱讀(恕我直言)。

這是關於你的情況比較,唯一不同的是你使用的GUID(UNIQUEIDENTIFIER),必須使用MAX()之前被轉換爲另一種數據類型(例如VARCHAR(50))。

只有三個每個帳戶ID值,這裏是一個方法,你可以實現你想要的使用條件彙總:

DECLARE @myTable TABLE (AccountID UNIQUEIDENTIFIER, Value UNIQUEIDENTIFIER); 

INSERT @myTable (AccountID, Value) 
VALUES ('8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB','34CD2F7D-E146-457E-B524-298D15EE0063'), 
     ('8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB','4FC58366-C797-4CAB-8A90-FE7425C1EDCD'), 
     ('8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB','10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC'),  
     ('02423075-6C7D-4AEB-AE8C-059E43914D53','8327537F-B0CB-43A4-B9BC-31E0A6377F99'), 
     ('02423075-6C7D-4AEB-AE8C-059E43914D53','2EE12215-AF0D-4636-9E37-7F49EDA22AFF'), 
     ('BEE8C007-ECA3-4327-8248-A1A66925EE9E','8FC3D058-0AC8-4295-A34D-28755DB52F54'); 

SELECT AccountID, 
     Value1 = MAX(CASE WHEN RN = 1 THEN Value END), 
     Value2 = MAX(CASE WHEN RN = 2 THEN Value END), 
     Value3 = MAX(CASE WHEN RN = 3 THEN Value END) 
FROM 
(
    SELECT AccountID, 
      Value = CONVERT(VARCHAR(50), Value), -- Cast GUID as VARCHAR(50) to use MAX() in the outer query. 
      RN = ROW_NUMBER() OVER (PARTITION BY AccountID ORDER BY Value) 
    FROM @myTable 
) T 
GROUP BY AccountID; 
0

如果你想嘗試一個替代透視表,編輯你的選擇,以確保c1.value是最小的,並且c2.value> c1.value和c3.value> c2.value 對不起,我沒有有SSMS現在編寫和測試代碼

0

不知道如果這你是什麼後

WITH cte as 
(
SELECT '8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB' ID , '34CD2F7D-E146-457E-B524-298D15EE0063' Value UNION ALL 
SELECT '8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB' ID , '4FC58366-C797-4CAB-8A90-FE7425C1EDCD' Value UNION ALL 
SELECT '8CD291F7-1A7E-409B-8D4C-7BECEE5DEBFB' ID , '10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC' Value UNION ALL 
SELECT '02423075-6C7D-4AEB-AE8C-059E43914D53' ID , '8327537F-B0CB-43A4-B9BC-31E0A6377F99' Value UNION ALL 
SELECT '02423075-6C7D-4AEB-AE8C-059E43914D53' ID , '2EE12215-AF0D-4636-9E37-7F49EDA22AFF' Value UNION ALL 
SELECT 'BEE8C007-ECA3-4327-8248-A1A66925EE9E' ID , '8FC3D058-0AC8-4295-A34D-28755DB52F54' Value) 
select c1.ID,c1.Value Value_1 ,c2.value 
INTO #temp 
from cte c1 inner join cte c2 on c1.ID=c2.ID 


WITH BaseQuery AS (
select ID,Value,Value_1 from #temp 
) 
SELECT ID, 
[10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC] V1, 
[2EE12215-AF0D-4636-9E37-7F49EDA22AFF] V2, 
[34CD2F7D-E146-457E-B524-298D15EE0063] V3, 
[4FC58366-C797-4CAB-8A90-FE7425C1EDCD] V4, 
[8327537F-B0CB-43A4-B9BC-31E0A6377F99] V5, 
[8FC3D058-0AC8-4295-A34D-28755DB52F54] V6 
FROM BaseQuery 
PIVOT(max(value_1) FOR Value in (
[10C64CEE-E026-4197-8BC9-CF5B0EE8ADBC], 
[2EE12215-AF0D-4636-9E37-7F49EDA22AFF], 
[34CD2F7D-E146-457E-B524-298D15EE0063], 
[4FC58366-C797-4CAB-8A90-FE7425C1EDCD], 
[8327537F-B0CB-43A4-B9BC-31E0A6377F99], 
[8FC3D058-0AC8-4295-A34D-28755DB52F54])) AS PVT 
相關問題