【问题标题】:Distribute arbitrary rows on multiple columns在多列上分布任意行
【发布时间】:2016-01-24 08:00:36
【问题描述】:

我有一张材料表。 我需要从该表中填写数据输入表。

问题是数据输入表被分成了多列,每一列都包含一些材料,如图所示。 如何编写一个 tsql 选择查询,将第一束材料名称放入一列,第二束放入第二列,依此类推。

【问题讨论】:

    标签: sql-server tsql data-entry


    【解决方案1】:

    在客户端而不是在数据库中这样做可能是最简单的,但如果你真的想这样做,我认为将行分配到 3 组的最简单方法是使用带模的 row_number() 3并使用它构建单独的列。这将使行的排序略有不同:

    A    B    C
    D    E    F
    G    H
    

    如果您需要以其他顺序排列它们,则需要将 row_number() 除以行数除以 3。这样您就可以按顺序排列它们了

    A    D    G
    B    E    H
    C    F
    

    例子:

    select
      max(case when GRP = 0 then VALUE end),
      max(case when GRP = 1 then VALUE end),
      max(case when GRP = 2 then VALUE end)
    from
    (
        select 
          (row_number() over (order by VALUE)-1) % 3 as GRP, 
          (row_number() over (order by VALUE)-1) / 3 as ROW, 
          VALUE
        from table1
    )X
    group by ROW
    

    SQL Fiddle 中的示例

    编辑:示例如何以其他方式划分行:

    declare @NOLINES int
    select @NOLINES = ceiling(count(*) / 3.0) from table1
    
    select
      max(case when GRP = 0 then VALUE end),
      max(case when GRP = 1 then VALUE end),
      max(case when GRP = 2 then VALUE end)
    from
    (
        select 
          (row_number() over (order by VALUE)-1) / @NOLINES as GRP, 
          (row_number() over (order by VALUE)-1) % @NOLINES as ROW, 
          VALUE
        from table1
    )X
    group by ROW
    

    【讨论】:

    • 非常感谢。您能否再举一个示例以与问题中的其他方式显示行?
    • 你只需要有行数+交换模数和除法。为此添加了示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多