2016-09-07 60 views
-1

任何人都可以幫我解決這個問題嗎?SQL - ORDER BY子句(多個數據在1列中)

如何查詢此:

WHAT SHOULD BE THE RESULT TABLE

我的查詢:

`SELECT TOP 1000 [WireID] 
    ,[PadNo] 
    ,[Pattern] 
    ,[Tester] 
    FROM FROM [WLSystem].[dbo].[TblR8Pure] 
    ORDER BY LEN(Tester), Tester ASC` 

結果:

MY QUERY RESULT

+2

請在文本格式的樣本數據,而不是像圖片。 –

+1

將值存儲爲csv不是很好的db設計。你應該改變它 – Jens

+0

@GiorgosBetsos在圖像中呈現樣本結果。 – itsMacyAnn

回答

0

嘗試用下面的查詢。

SELECT TOP 1000 [WireID] 
    ,[PadNo] 
    ,[Pattern] 
    ,[Tester] 
    FROM FROM [WLSystem].[dbo].[TblR8Pure] 
    ORDER BY Tester ASC 
0

除了事實這種約會存儲是不好的設計。該查詢將按測試者列的前3個數字對結果進行排序。這通過使用東西來刪除所有剩餘的字符。

SELECT TOP 1000 [WireID] 
    ,[PadNo] 
    ,[Pattern] 
    ,[Tester] 
    FROM FROM [WLSystem].[dbo].[TblR8Pure] 
    ORDER BY STUFF(Tester,4,99,'') ASC 
+0

Msg 174,Level 15,State 1,Line 6 stuff函數需要4個參數。 – itsMacyAnn

+0

抱歉忘了添加''來替換剩餘的字符,無法再次嘗試。 – LemonC200

1

您可以使用SUBSTRINGCHARINDEX從逗號分隔字符串得到第一個項目:

SELECT TOP 1000 
     [WireID], 
     [PadNo], 
     [Pattern], 
     [Tester]  
FROM [WLSystem].[dbo].[TblR8Pure] 
ORDER BY CAST(
     CASE WHEN CHARINDEX(';',[Tester])-1 < 0 THEN REPLACE([Tester],CHAR(13)+CHAR(10),'') 
      ELSE REPLACE(SUBSTRING([Tester],1,CHARINDEX(';',[Tester])-1),CHAR(13)+CHAR(10),'') 
      END 
      as int) 

但最好的辦法是將資料標準化,並在1列擺脫逗號分隔值的。

+0

嗨@ gofr1我試圖通過較低的值執行您的查詢,如40是中間的。試着看看我編輯的帖子。謝謝 – itsMacyAnn

+0

我按語句順序添加了cast(... as int)。嘗試此查詢 – gofr1

+0

消息245,級別16,狀態1,行1 將varchar值「100 」轉換爲數據類型爲int時轉換失敗。 – itsMacyAnn

0

確保包含文本格式的測試數據。答案要容易得多。您也會收到更多有價值的答案。

Simpified測試數據:

CREATE TABLE #TblR8Pure 
(
    [No] int, 
    PadNo varchar(10), 
    Pattern int, 
    Jumper varchar(100) 
) 

INSERT #TblR8Pure VALUES 
(3, '4_39', 85, '40'), 
(3, '4_45', 79, '225 ; 219'), 
(3, '4_40', 79, '418 ; 566'), 
(3, '4_46', 79, '229 ; 355 ; 320'), 
(3, '4_44', 79, '234 ; 362 ; 318'), 
(3, '4_55', 79, '1000 ; 1') 

下面是溶液的規則:

  1. 記錄由在分號分隔值找到最小跳線排序,轉換爲int(XML部分)
  2. 值可以有白色字符(LTRIM,RTRIM)
  3. 如果找到兩個相等的跳線,記錄按第二,第三等排序(PIVOT和OR DER部分,這裏限於5個字段)。

這裏是解決方案:

SELECT [No], PadNo, Pattern, Jumper FROM 
(
    SELECT [No], PadNo, Pattern, Jumper, Rec, Value, ROW_NUMBER() OVER (PARTITION BY Rec ORDER BY Value) R FROM 
    (
     SELECT [No], PadNo, Pattern, Jumper, Rec, CONVERT(int, RTRIM(LTRIM(R.value('.', 'varchar(10)')))) Value FROM 
     (SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) Rec, CONVERT(xml,'<a>'+REPLACE(Jumper, ';', '</a><a>')+'</a>') X FROM #TblR8Pure) T 
     CROSS APPLY T.X.nodes('a') T2(R) 
    ) T 
) T 
PIVOT 
(MAX(Value) FOR R IN ([1],[2],[3],[4],[5])) P 
ORDER BY [1],[2],[3],[4],[5]