1 回答
TA贡献1815条经验 获得超10个赞
我认为这是与 SQL-Server 相关的......
您的问题是:SQL-Server 表没有任何类型的隐式排序顺序。一个简单SELECT * FROM SomeWhere的可以按照您插入数据的排序顺序返回,但也可以返回完全不同的。确保排序顺序的唯一机会是ORDER BY针对(一组)唯一列的最外层查询。
您可以通过分析数据来创建排序顺序:
这是一个包含您的测试数据的模型表:
DECLARE @mockup TABLE(YourColumn VARCHAR(100));
INSERT INTO @mockup VALUES
('FR123456')
,('24/02/1988')
,('500');
--查询将检查值是否可以转换为数字、日期。
--这将用于对值进行排序。
--我使用105inCONVERT来强制执行日期格式dd-MM-yyyy
SELECT CASE WHEN TRY_CONVERT(DATE,YourColumn,105) IS NOT NULL THEN 2
ELSE CASE WHEN TRY_CAST(YourColumn AS INT) IS NOT NULL THEN 3 ELSE 1
END
END AS SortOrder
,YourColumn
FROM @mockup
ORDER BY SortOrder;
但是,如果您的表中有几个三胞胎,而不仅仅是您的样本中的一个,恐怕您会迷路...
顺便说一句:你自己的方法试图做同样的事情:
SELECT row_number() OVER (order by splitdata desc)as Id
这将创建一种排序顺序号,但它将是随机的(数量将根据字母数字规则出现在日期之前或之后)。
暗示
在表中添加一IDENTITY列。这将在任何行创建时使用越来越多的数字。这些值可用于强制执行插入的顺序(通过ORDER BY与此列一起使用)。
更新:您的查询
SELECT [1], [2] , [3]
FROM
(SELECT CASE WHEN TRY_CONVERT(DATE,splitdata,105) IS NOT NULL THEN 2
ELSE CASE WHEN TRY_CAST(splitdata AS INT) IS NOT NULL THEN 3 ELSE 1
END
END AS Id , splitdata
from @mockup ) AS SourceTable
PIVOT
(
MIN (splitdata)
FOR id IN ([1], [2], [3])
) AS PivotTable;
- 1 回答
- 0 关注
- 161 浏览
添加回答
举报
