按数字 sql 的字符串排序

order by a string as number sql

我有一个如下所示的 table,我需要将 table 调整为数周。我可以创建数据透视表 table,但是自从我订购了一个字符串列以来,列顺序被打乱了。并获得像 3nd table.

这样的输出
MRN                   Weeks
--------------------------------
GIRFTR1H0461081       52
GIRFTR1H0461083       5 - 6
GIRFTR1H0461084       0 - 1
GIRFTR1H0461085       1 - 2
GIRFTR1H0461086       11 - 12
GIRFTR1H0461087       1 - 2

我需要将输出作为枢轴 table 按周数排序,

MRN               | 0 - 1 | 1 - 2 | 5 - 6 |11 - 12|  52
---------------------------------------------------------------
GIRFTR1H0461081   |   0   |   0   |   0   |  0    |  0
GIRFTR1H0461083   |   0   |   0   |   1   |  0    |  0
GIRFTR1H0461084   |   1   |   0   |   0   |  0    |  0
GIRFTR1H0461085   |   0   |   1   |   0   |  0    |  0
GIRFTR1H0461086   |   0   |   0   |   0   |  1    |  0
GIRFTR1H0461087       0   |   1   |   0   |  0    |  0

当我尝试创建这个 table 时,列的顺序被打乱,如下所示,

MRN               | 0 - 1 | 1 - 2 |11 - 12| 5 - 6 |  52
---------------------------------------------------------------
GIRFTR1H0461081   |   0   |   0   |   0   |  0    |  0
GIRFTR1H0461083   |   0   |   0   |   0   |  1    |  0
GIRFTR1H0461084   |   1   |   0   |   0   |  0    |  0
GIRFTR1H0461085   |   0   |   1   |   0   |  0    |  0
GIRFTR1H0461086   |   0   |   0   |   1   |  0    |  0
GIRFTR1H0461087   |   0   |   1   |   0   |  0    |  0

我的代码是,

    DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

    select @cols = STUFF((SELECT ',' + QUOTENAME(WeeksBand) 
                          from [test_Tbl]
                          group by WeeksBand
                          order by WeeksBand
                          FOR XML PATH(''), TYPE
                         ).value('.', 'NVARCHAR(MAX)') 
                    ,1,1,'')

    set @query = 'SELECT CurrentSpecialty,' + @cols + ' from 
                (
                   select CurrentSpecialty, WeeksBand, EncounterId
                   from [Tbl_Current_PTL_Test]
                ) x
               pivot 
                (
                   count(EncounterId)
                   for WeeksBand in (' + @cols + ')
                ) p '

   execute(@query);

请帮我解决我的问题,

我不明白为什么标准数据透视查询在这里不起作用。从您的预期输出来看,您似乎想要 1 作为该周出现的 MRN 条目的占位符,否则 0

SELECT [MRN],
       MAX(CASE WHEN [Weeks] = '0 - 1'   THEN 1 ELSE 0 END) AS [0 - 1],
       MAX(CASE WHEN [Weeks] = '1 - 2'   THEN 1 ELSE 0 END) AS [1 - 2],
       MAX(CASE WHEN [Weeks] = '5 - 6'   THEN 1 ELSE 0 END) AS [5 - 6],
       MAX(CASE WHEN [Weeks] = '11 - 12' THEN 1 ELSE 0 END) AS [11 - 12],
       MAX(CASE WHEN [Weeks] = '52'      THEN 1 ELSE 0 END) AS [52]
FROM [yourTable]
GROUP BY [MRN]

您应该使用 2 位数字将第一个 table 的周字段格式化为:

MRN                   Weeks
--------------------------------
GIRFTR1H0461081       52
GIRFTR1H0461083       05 - 06
GIRFTR1H0461084       00 - 01
GIRFTR1H0461085       01 - 02
GIRFTR1H0461086       11 - 12
GIRFTR1H0461087       01 - 02

它正在进行字符串(alpha)排序,而您实际上想要进行数字排序。

我会更改订单行:

按 WeeksBand 排序

至:

按 Cast(SubString(WeeksBand, 1, CASE WHEN CHARINDEX('-', WeeksBand) != 0 THEN CHARINDEX('-', WeeksBand) -1 ELSE LEN(WeeksBand) END) AS INT)

这会将第一个数字转换为整数值(不是字符串),然后应该正确排序。