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 關注
- 110 瀏覽
添加回答
舉報