C# TSQL将表中的一列转换为一行

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 从拆分数

我有一个临时表,其中一列包含3条数据:代码、日期和数量

例如:

-------
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;