为了账号安全,请及时绑定邮箱和手机立即绑定

TSQL 将表中的一列转置为一行

TSQL 将表中的一列转置为一行

C#
扬帆大鱼 2022-07-23 16:34:40
我有一个临时表,其中一列包含 3 条数据:Code、Date和Quantity.例子:-------FR12345624/02/1988500我需要将此列中的数据提取到单独的列中。例子:Code     | Date       | Quantity---------  -----------  ---- FR123456 | 24/02/1988 | 500我使用了这段代码:SELECT [1], [2], [3]FROM  (    SELECT row_number() OVER (ORDER BY splitdata DESC) AS Id, splitdata      FROM splitdata ) AS SourceTable  PIVOT  (      MIN (splitdata)    FOR id IN ([1], [2], [3])  ) AS PivotTable;它的问题是一旦数据内容发生变化,由于聚合函数(MIN),我可能会将数量内容放入日期列。
查看完整描述

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;


查看完整回答
反对 回复 2022-07-23
  • 1 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号