我有一个名为customer-range的字段,对于某些客户,该字段具有以下方式的值:
Customer ID, Customer-range
1111,[0-1]
1111,[1-2]
1111,[2-3]
对于某些客户来说,它只是一个这样的整数:
2222, 11
2222, 3
2222, 14
所以基本上我想编写一个订购客户范围的select语句。它是数据库中的文本字段。我怎样才能做到这一点?
这是我在Google和在线朋友的帮助下尝试过的:
;WITH MyCTE
AS (
SELECT 1111 CustID
,'[0-1]' CustomerRange
UNION
SELECT 1111
,'[10-13]'
UNION
SELECT 1111
,'[7-10]'
)
SELECT *
,CASE
WHEN CHARINDEX('[', CustomerRange) = 0
THEN '[' + CustomerRange + '-' + CustomerRange + ']'
ELSE CustomerRange
END SortedBy
FROM MyCTE
ORDER BY CASE
WHEN CHARINDEX('[', CustomerRange) = 0
THEN '[' + CustomerRange + '-' + CustomerRange + ']'
ELSE CustomerRange
END
当整数值小于10时,上面的代码可以工作,但似乎没有为超过9的任何值对它们进行排序。 上面例子的顺序应该是 [0-1] [7-10] [10-13]
谢谢
答案 0 :(得分:1)
你走了:
;WITH MyCTE
AS (
SELECT 1111 CustID
,'[0-1]' CustomerRange
UNION
SELECT 1111
,'[10-13]'
UNION
SELECT 1111
,'[7-10]'
)
,MyCTE1
AS (
SELECT CustID
,CASE
WHEN CHARINDEX('[', CustomerRange) = 0
THEN '[' + CustomerRange + '-' + CustomerRange + ']'
ELSE CustomerRange
END SortedBy
FROM MyCTE
)
,MySortCTE
AS (
SELECT replace(substring(sortedby, charindex('-', sortedby) + 1, len(sortedby)), ']', '') AS sort_num
,CustID
,SortedBy
FROM MyCTE1
)
SELECT CustID,SortedBy
FROM mySortCTE
-- WHERE CUSTID = 1111 uncomment this line to filter CustID
ORDER BY sort_num
答案 1 :(得分:1)
您的数据结构不符合良好的规范化实践。您应该将CustomerRange分为两列。一个低和一个高数字。由于您可能无法对其进行更改,因此这里的查询将执行我认为您想要的操作,即按CustID和CustomerRange中的第一个数字进行排序。
WITH MyCTE
AS
(
SELECT 1111 CustID,CustomerRange
FROM (VALUES('0-1'),('10-13'),('7-10')) AS A(CustomerRange)
UNION ALL
SELECT 2222,CustomerRange
FROM (VALUES('11'),('3'),('14')) B(CustomerRange)
)
SELECT CustID,
CustomerRange,
CASE
WHEN CHARINDEX('-',CustomerRange) = 0
THEN CONCAT('[',CustomerRange,'-',CustomerRange,']')
ELSE CONCAT('[',CustomerRange,']')
END Range_With_Brackets,
order_col
FROM MyCTE
CROSS APPLY (SELECT CAST(LEFT(CustomerRange,CHARINDEX('-',CustomerRange + '-' ) - 1) AS INT)) CA(order_col)
ORDER BY CustID,order_col
结果:
CustID CustomerRange Range_With_Brackets order_col
----------- ------------- ------------------- -----------
1111 0-1 [0-1] 0
1111 7-10 [7-10] 7
1111 10-13 [10-13] 10
2222 3 [3-3] 3
2222 11 [11-11] 11
2222 14 [14-14] 14
答案 2 :(得分:0)
我无法真正了解您希望订购的方式,但是为了回应您的评论"当整数值小于10时,但似乎没有为任何值排序它们超过9",看起来它将您的数字视为字符串,这就是为什么不正确订购。例如数字11大于9但字符串" 11"小于" 9"
您必须使用CAST将字符串转换为数字