按字符串作为数字sql排序
我有一张如下的表格,我需要用几个星期来调整表格。我可以创建pivot表,但是由于我在排序一个字符串列,所以列的顺序被打乱了。并获得像3nd表一样的输出按字符串作为数字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
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)
它将第一个数字转换为整数值(不是字符串),然后应正确排序