2016-03-03 106 views
0

我已經搜索並搜索,但我甚至不知道該怎麼稱呼它。我想寫使用密鑰值會將數據的SQL查詢...SQL按值拆分列

╔══════╦══════╗ 
║ Type ║ Data ║ 
╠══════╬══════╣ 
║ 1 ║ a ║ 
║ 1 ║ b ║ 
║ 1 ║ c ║ 
║ 2 ║ d ║ 
║ 2 ║ e ║ 
║ 2 ║ f ║ 
║ 3 ║ g ║ 
║ 3 ║ h ║ 
║ 3 ║ i ║ 
╚══════╩══════╝ 

要...

╔═══╦═══╦═══╗ 
║ a ║ d ║ g ║ 
║ b ║ e ║ h ║ 
║ c ║ f ║ i ║ 
╚═══╩═══╩═══╝ 

這是什麼所謂?我該怎麼辦呢?

+0

可能是你正在尋找什麼叫「樞軸」在SQL ....但它不會完成這至少我的知識 – Praveen

+0

但是,如果你有不同的基數會發生什麼 - 如果你有3組1,但沒有組2也許五組2? – LSerni

+0

您正在使用哪些DBMS? –

回答

0

這有效,但它很混亂。

忽略的#Test創作,因爲你已經有一個表

IF OBJECT_ID('tempdb..#Test') IS NOT NULL 
DROP TABLE #Test 

IF OBJECT_ID('tempdb..#Results') IS NOT NULL 
DROP TABLE #Results 

DECLARE @i AS INTEGER 
SET @i = 1 

CREATE TABLE #Test 
(Type INT 
,Data CHAR(1)) 

INSERT INTO #Test 
VALUES 
(1, 'a'), 
(1, 'b'), 
(1, 'c'), 
(2, 'd'), 
(2, 'e'), 
(2, 'f'), 
(3, 'g'), 
(3, 'h'), 
(3, 'i') 

CREATE TABLE #Results 
([1] CHAR(1) 
,[2] CHAR(2) 
,[3] CHAR(3)) 

WHILE @i <= (SELECT COUNT(*) FROM #Test WHERE Type = 1) 

BEGIN 

INSERT INTO #Results 
SELECT 
(SELECT TOP 1 Data FROM #Test WHERE Type = 1 AND Data NOT IN (SELECT [1] FROM #Results)) [1] 
,(SELECT TOP 1 Data FROM #Test WHERE Type = 2 AND Data NOT IN (SELECT [2] FROM #Results)) [2] 
,(SELECT TOP 1 Data FROM #Test WHERE Type = 3 AND Data NOT IN (SELECT [3] FROM #Results)) [3] 
FROM #Test 

SET @i = @i + 1 

END 

SELECT DISTINCT * FROM #Results 
0

一種方式是你有羣體創造儘可能多的配套表。因此,您將創建table1table2table3

然後,您將組1中所有值的SELECT DISTINCT轉換爲table1,依此類推。

現在您需要將這三個表拼接在一起作爲新表中的列。要做到這一點,你需要另一個元素 - 一個計數器。根據你的SQL風格,你可以用幾種不同的方式來完成這個任務。

最後,你將有形式的三個表

Table1  Table2  Table3 
id value  id value id value 
1 a   1 d  1 f 
2 b   2 e  2 g 
3 c      3 h 
          4 i 

鏈接在一起的這些,你選擇了最長的一個,並與別人跑LEFT JOIN S:

SELECT table1.value AS group1, table2.value AS group2, table3.value AS group3 
FROM table3 
LEFT JOIN table2 ON (table3.id = table2.id) 
LEFT JOIN table1 ON (table3.id = table1.id); 

,並會得到

group1 group2 group3 
a   d  f 
b   e  g 
c   NULL  h 
NULL  NULL  i 

您還可以對所有值進行增量分組編號s使用一個附加列:

xid group value 
1  1  a 
2  1  b 
3  1  c 
1  2  d 
2  2  e 
1  3  f 
... 

請注意(group,xid)現在是主鍵。現在你可以加入你自己的表格:

SELECT t1.value AS g1, t2.value AS g2, t3.value AS g3 
FROM yourtable AS t3 
LEFT JOIN yourtable AS t1 ON (t3.xid = t1.xid) 
LEFT JOIN yourtable AS t2 ON (t3.xid = t2.xid) 

在這裏再一次,組3是基數最大的一個。這不需要額外的表格,但是用於拼接樞軸的一個額外列xid的編號稍微複雜一些。