MSSQL将行分配到静态列数

时间:2015-06-26 06:55:50

标签: sql-server

我无法想象如何编写一个mssql select来将单个表中的结果分配到静态数量的多列中,让我们说3。

现有表格数据的示例:

select item,qty from Table1

item1 qty1
item2 qty2
item3 qty3
item4 qty4
item5 qty5
item6 qty6
item7 qty7

期望的输出(无论顺序):

  item1 qty1    item2 qty2    item3 qty3    
  item4 qty4    item5 qty5    item6 qty6
  item7 qty7    item8 qty8

尝试使用枢轴,但每行只输出一个项目,看起来不是正确的解决方案。

2 个答案:

答案 0 :(得分:1)

只是为了表明可以完成,但可能不应该 1

declare @t table (item varchar(19) not null,qty varchar(17) not null);
insert into @t(item,qty) values
('item1','qty1'),
('item2','qty2'),
('item3','qty3'),
('item4','qty4'),
('item5','qty5'),
('item6','qty6'),
('item7','qty7'),
('item8','qty8');

WITH Numbered as (
    select *,ROW_NUMBER() OVER (ORDER BY item) + 2 as rn
    from @t
), Positioned as (
    select item,CONVERT(varchar(19),qty) as qty,rn%3 as col,rn/3 as rw
    from Numbered
), Combined as (
    select col,rw,type,value
    from Positioned
        unpivot (value for type in (item,qty)) t
), Labelled as (
    select rw,type + CONVERT(varchar(9),col) as finalcol,value
    from Combined
)
select *
from Labelled
    pivot (MAX(value) for finalcol in (item0,qty0,item1,qty1,item2,qty2)) u;

结果:

rw                   item0               qty0                item1               qty1                item2               qty2
-------------------- ------------------- ------------------- ------------------- ------------------- ------------------- -------------------
1                    item1               qty1                item2               qty2                item3               qty3
2                    item4               qty4                item5               qty5                item6               qty6
3                    item7               qty7                item8               qty8                NULL                NULL

CTE如下 - Numbered为每一行分配行号,因为只是因为你想要的东西是任意的并不意味着SQL很乐意这样做。然后,我们在Positioned中将这些行号转换为列(col)和行(row)坐标。

确定了要放置所有内容的位置后,我们需要为最终的PIVOT操作做好准备 - 通过UNPIVOT将所有值转移到一个列中value在{ {1}})。

Combined开始,我们可以将原始列名(Labelled)与为其选择的列合并。

在最终查询中,我们将所有这些信息合并到最终type中,以创建所需的列集。

1 因为这种显示/表示逻辑确实属于设计的语言或工具,用于表示关注点,而不是深入到数据库的内容中。 / p>

答案 1 :(得分:0)

以下是一些例子:

Type 'Array<AnyObject>' does not conform to protocol 'AnyObject'

输出:

DECLARE @t TABLE
    (
      item VARCHAR(10) ,
      qty VARCHAR(20)
    )
INSERT  INTO @t
VALUES  ( 'item1', 'qty1' ),
        ( 'item2', 'qty2' ),
        ( 'item3', 'qty3' ),
        ( 'item4', 'qty4' ),
        ( 'item5', 'qty5' ),
        ( 'item6', 'qty6' ),
        ( 'item7', 'qty7' );

WITH  cte AS ( SELECT   * ,
                        ( ROW_NUMBER() OVER ( ORDER BY item ) - 1 ) % 3 AS rn ,
                        ( ROW_NUMBER() OVER ( ORDER BY item ) - 1 ) / 3 AS gr
               FROM     @t)
    SELECT  MAX(CASE WHEN rn = 0 THEN item END) itemA ,
            MAX(CASE WHEN rn = 0 THEN qty END) qtyA ,  
            MAX(CASE WHEN rn = 1 THEN item END) itemB ,
            MAX(CASE WHEN rn = 1 THEN qty END) qtyB ,
            MAX(CASE WHEN rn = 2 THEN item END) itemC ,
            MAX(CASE WHEN rn = 2 THEN qty END) qtyC
    FROM    cte
    GROUP BY gr 

itemA qtyA itemB qtyB itemC qtyC item1 qty1 item2 qty2 item3 qty3 item4 qty4 item5 qty5 item6 qty6 item7 qty7 NULL NULL NULL NULL 给出了列的位置。 rn给出了分组序列。

gr

因此,您按item qty rn gr item1 qty1 0 0 item2 qty2 1 0 item3 qty3 2 0 item4 qty4 0 1 item5 qty5 1 1 item6 qty6 2 1 item7 qty7 0 2 进行分组,并按gr分发列。