C# TSQL将表中的一列转换为一行
我有一个临时表,其中一列包含3条数据:代码、日期和数量 例如:C# TSQL将表中的一列转换为一行,c#,tsql,C#,Tsql,我有一个临时表,其中一列包含3条数据:代码、日期和数量 例如: ------- FR123456 24/02/1988 500 我需要将此列中的数据提取到单独的列中 例如: Code | Date | Quantity --------- ----------- ---- FR123456 | 24/02/1988 | 500 我使用了以下代码: 选择[1]、[2]、[3] 从…起 选择订单上的行号,按Id splitdata DESC,splitdata 从拆分数
-------
FR123456
24/02/1988
500
我需要将此列中的数据提取到单独的列中
例如:
Code | Date | Quantity
--------- ----------- ----
FR123456 | 24/02/1988 | 500
我使用了以下代码:
选择[1]、[2]、[3]
从…起
选择订单上的行号,按Id splitdata DESC,splitdata
从拆分数据
作为源表
支点
最小分割数据
对于[1]、[2]、[3]中的id
作为数据透视表;
它的问题是,一旦数据内容发生更改,由于聚合函数MIN,我可能会将数量内容放入日期列。我假设这与SQL Server相关 您的问题是:SQL Server表没有任何类型的隐式排序顺序。一个简单的SELECT*从某处可以按照插入数据的排序顺序返回,但返回的结果也可能完全不同。确保排序顺序的唯一机会是在最外层查询一组唯一列的顺序 您可以通过分析数据来创建排序顺序: 这是一个包含测试数据的模型表:
DECLARE @mockup TABLE(YourColumn VARCHAR(100));
INSERT INTO @mockup VALUES
('FR123456')
,('24/02/1988')
,('500');
-查询将检查这些值是否可以转换为数字、日期。
-这将用于对值进行排序。
-我在CONVERT中使用105来强制使用日期格式dd-MM-yyyy
在TRY_CONVERTDATE时选择CASE,您的列105不为空,然后选择2
如果TRY_CASTYourColumn AS INT不为NULL,则为3 ELSE 1
终止
以排序者的身份结束
,你的专栏
来自@mockup
巫师命令;
但是如果你的桌子上有好几个三胞胎,而不是像你的样品中那样只有一个,恐怕你迷路了
顺便说一句:您自己的方法尝试做完全相同的事情:
SELECT row_number() OVER (order by splitdata desc)as Id
这将创建一种排序顺序号,但它将是随机的,数量将出现在日期之前或之后,具体取决于字母数字规则
暗示
向表中添加标识列。这将在创建任何行时对其使用递增的数字。这些值可用于通过在此列中使用order by强制执行插入的顺序
更新:您的查询
谢谢你的回复,Shnugo。这很有帮助
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;