SQL - ORDER BY子句(1列中的多个数据)

时间:2016-09-07 09:24:17

标签: sql sql-server tsql sql-server-2008-r2

任何人都可以帮我解决这个问题吗?

如何查询:

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

6 个答案:

答案 0 :(得分: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列中删除逗号分隔值。

答案 1 :(得分:0)

尝试使用以下查询。

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

答案 2 :(得分:0)

除了事实,这种类型的约会存储是糟糕的设计。此查询将按测试器列的前3个数字对结果进行排序。这通过使用东西来删除所有剩余的字符。

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

答案 3 :(得分:0)

确保以文本格式包含测试数据。回答要容易得多。您还会收到更多有价值的答案。

简化测试数据:

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和ORDER部分,此处限制为5个字段)。
  4. 这是解决方案:

    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]
    

答案 4 :(得分:0)

得到了正确答案=)

MS SQL:

Correct Answer MsSQL

MYSQL:

Correct Answer MySQL

答案 5 :(得分:0)