sql - 如何在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
解决方案
你想要一种交叉连接加上反透视
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
推荐阅读
- javascript - React:判断一个元素是否在另一个 ref 容器中
- excel - 在两个用户表单之间传递数据不起作用
- unity3d - Unity OnMouseEnter() 或 OnMouseOver() 不起作用
- c - 将文件映射到内存并写入文件末尾
- javascript - 使这种形状(附图片)完全发挥作用的最佳方法是什么?
- node.js - 带有子节点的 graphql 订阅似乎对我不起作用
- ruby - 如何从文件中删除行而不在 ruby 中创建临时文件?
- java - 无法从 HttpURLConnection POST 方法获得响应
- php - 获取递归 Laravel 关系中的最后一项
- react-router - Gatsby JS:在 onRouteUpdate 之后集成 cubeportfolio 库和重绘