Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按字符串作为数字sql排序_Sql_String_Pivot_Sql Order By - Fatal编程技术网

按字符串作为数字sql排序

按字符串作为数字sql排序,sql,string,pivot,sql-order-by,Sql,String,Pivot,Sql Order By,我有一张如下的表格,我需要用几个星期来调整表格。我可以创建pivot表,但是由于我在排序一个字符串列,所以列的顺序被打乱了。并获得像3nd表一样的输出 MRN Weeks -------------------------------- GIRFTR1H0461081 52 GIRFTR1H0461083 5 - 6 GIRFTR1H0461084 0 - 1 GIRFTR1H0461085 1 - 2 GIRF

我有一张如下的表格,我需要用几个星期来调整表格。我可以创建pivot表,但是由于我在排序一个字符串列,所以列的顺序被打乱了。并获得像3nd表一样的输出

MRN                   Weeks
--------------------------------
GIRFTR1H0461081       52
GIRFTR1H0461083       5 - 6
GIRFTR1H0461084       0 - 1
GIRFTR1H0461085       1 - 2
GIRFTR1H0461086       11 - 12
GIRFTR1H0461087       1 - 2
我需要在几周内以数据透视表的形式获得输出,比如

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
当我试图创建这个表时,列的顺序像下面的一样混乱

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);

请帮我整理一下我的问题,

我不明白为什么标准pivot查询在这里不起作用。从您的预期输出来看,您似乎想要一个
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位数字格式化第一个表的Week字段,如下所示:

MRN                   Weeks
--------------------------------
GIRFTR1H0461081       52
GIRFTR1H0461083       05 - 06
GIRFTR1H0461084       00 - 01
GIRFTR1H0461085       01 - 02
GIRFTR1H0461086       11 - 12
GIRFTR1H0461087       01 - 02
它在进行字符串(alpha)排序,而实际上,您希望进行数字排序

我将订单行从:

按星期顺序排列

致:

按强制转换排序(子字符串(WeeksBand,1,当CHARINDEX('-',WeeksBand)!=0时,则CHARINDEX('-',WeeksBand)-1,否则LEN(WeeksBand)END为INT)

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