我无法想象如何编写一个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
尝试使用枢轴,但每行只输出一个项目,看起来不是正确的解决方案。
答案 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
分发列。