2009-06-26 58 views
3

)我試圖想出一種方法來組合基於行鍵的任何行中最長的字符串T-SQL從不同行中的最大長度列(?)對行分組(

例如

CREATE TABLE test1 
    (akey int not null , 
    text1 varchar(50) NULL, 
    text2 varchar(50) NULL, 
    text3 varchar(50) NULL ) 


INSERT INTO test1 VALUES (1,'Winchester Road','crawley',NULL) 
INSERT INTO test1 VALUES (1,'Winchester Rd','crawley','P21869') 
INSERT INTO test1 VALUES (1,'Winchester Road','crawley estate','P21869') 
INSERT INTO test1 VALUES (1,'Winchester Rd','crawley','P21869A') 
INSERT INTO test1 VALUES (2,'','birmingham','P53342B') 
INSERT INTO test1 VALUES (2,'Smith Close','birmingham North East','P53342') 
INSERT INTO test1 VALUES (2,'Smith Cl.',NULL,'P53342B') 
INSERT INTO test1 VALUES (2,'Smith Close','birmingham North','P53342') 

與這些行我要尋找的結果:

1 Winchester Road, crawley estate, P21869A 
2 Smith Close, birmingham North East, P53342B 

EDIT:上述需要的結果是在一個表拉澤而不僅僅是逗號分隔的字符串

正如您在結果中看到的,輸出應該是'akey'字段範圍中最長的文本列。

我試圖想出一個解決方案,不涉及每列上的大量子查詢,實際的表有32列和超過1300萬行。

我這樣做的原因是爲了創建一個在每一列,每列

這是我的第一篇文章只是一個ID最好的結果清潔的表,所以讓我知道如果你需要任何更多的信息,我很高興聽到關於張貼我已經破碎的任何最佳做法!

謝謝

本。

+0

感謝表格腳本! – Quassnoi 2009-06-26 10:35:32

+0

不客氣!我想,如果我想要一個答案,我需要讓人們輕鬆運行自己的測試。 – 2009-06-26 10:59:03

回答

2
SELECT A.akey, 
    (
     SELECT TOP 1 T1.text1 
     FROM test1 T1 
     WHERE T1.akey=A.akey AND LEN(T1.TEXT1) = MAX(LEN(A.text1)) 
    ) AS TEXT1, 
    (
     SELECT TOP 1 T2.text2 
     FROM test1 T2 
     WHERE T2.akey=A.akey AND LEN(T2.TEXT2) = MAX(LEN(A.text2)) 
    ) AS TEXT2, 
    (
     SELECT TOP 1 T3.text3 
     FROM test1 T3 
     WHERE T3.akey=A.akey AND LEN(T3.TEXT3) = MAX(LEN(A.text3)) 
    ) AS TEXT3 
FROM TEST1 AS A 
GROUP BY A.akey 

我剛纔意識到你說你有32列。我沒有看到這樣做的好方法,除非UNPIVOT允許您爲每個文本*列創建單獨的行(akey,textn)。

編輯:我可能沒有機會完成這個今天,但是UNPIVOT看起來很有用:

; 
WITH COLUMNS AS 
(
    SELECT akey, [Column], ColumnValue 
    FROM 
     (
      SELECT X.Akey, X.Text1, X.Text2, X.Text3 
      FROM test1 X 
     ) AS p 
    UNPIVOT (ColumnValue FOR [Column] IN (Text1, Text2, Text3)) 
    AS UNPVT 
) 
SELECT * 
FROM COLUMNS 
ORDER BY akey,[Column], LEN(ColumnValue) 
+0

unpivot確實看起來prommising,我還沒有使用樞軸/ unpivot很多。我假設我們需要在我們選擇最長的字符串之後將數據返回PIVOT? – 2009-06-26 12:19:46

1

這看起來真難看,但至少工作(上SQL2K)和不需要的子查詢:

select test1.akey, A.text1, B.text2, C.text3 
from test1 
inner join test1 A on A.akey = test1.akey 
inner join test1 B on B.akey = test1.akey 
inner join test1 C on C.akey = test1.akey 
group by test1.akey, A.text1, B.text2, C.text3 
having len(a.text1) = max(len(test1.text1)) 
    and len(B.text2) = max(len(test1.text2)) 
    and len(C.text3) = max(len(test1.text3)) 
order by test1.akey 

我必須承認,它需要一個內部聯接爲每列,我不知道這是怎麼在32列的影響X 13millions記錄表......我都試一下這種方法和基於一個一個子查詢和看着處決pla ns:我實際上很想知道