首页 > 解决方案 > 如何在sql server中创建组合组

问题描述

我有一个给定的表作为输入:

类别位置 类别 ID 分类名称 CategoryItemId 类别项目名称 类别项目位置
2 10 性别 11 男性 1
2 10 性别 12 女性 2
2 10 性别 13 不适用 3
1 7 小时 34 0 - 11 1
1 7 小时 35 12 - 39 2
1 7 小时 36 40 - 79 3
1 7 小时 37 80 - 119 4
1 7 小时 38 120+ 5
0 5 年龄 51 16-18 1
0 5 年龄 52 19-24 2
0 5 年龄 53 25-44 3
0 5 年龄 54 45-54 4
0 5 年龄 55 55-59 5
0 5 年龄 56 60+ 6

总行数:3(来自 Gender 的项目数)+ 5(来自 Hours 的项目数)+ 6(来自 Age 的项目数)= 14

我需要生成一个输出表,该表使用来自以下 3 个类别的项目组合组。

GroupPos 类别位置 类别 ID 分类名称 类别项目位置 CategoryItemId 类别项目名称
1 0 5 年龄 1 51 16-18
1 1 7 小时 1 34 0 - 11
1 2 10 性别 1 11 男性
2 0 5 年龄 2 52 19-24
2 1 7 小时 1 34 0 - 11
2 2 10 性别 1 11 男性
3 0 5 年龄 3 53 25-44
3 1 7 小时 1 34 0 - 11
3 2 10 性别 1 11 男性

……

总行数:3(Gender 中的项目数)* 5(Hours 中的项目数)* 6(Age 中的项目数)* 3(类别数)= 270

标签: sqlsql-server

解决方案


你想要一种交叉连接加上反透视

select (row_number() over(order by t1.CategoryItemPosition, t2.CategoryItemPosition, t3.CategoryItemPosition) - 1) / 3 + 1 GroupPos, t.*
from tbl t1 
join tbl t2 on t1.CategoryId = 10 and t2.CategoryId = 7 
join tbl t3 on t3.CategoryId = 5
cross apply (
 values 
   (0, t1.CategoryName, t1.CategoryId, t1.CategoryItemName, t1.CategoryItemId, t1.CategoryItemPosition),
   (1, t2.CategoryName, t2.CategoryId, t2.CategoryItemName, t2.CategoryItemId, t2.CategoryItemPosition),
   (2, t3.CategoryName, t3.CategoryId, t3.CategoryItemName, t3.CategoryItemId, t3.CategoryItemPosition)
) t(CategoryPosition, CategoryName, CategoryId, CategoryItemName, CategoryItemId, CategoryItemPosition)
order by t1.CategoryItemPosition, t2.CategoryItemPosition, t3.CategoryItemPosition

推荐阅读