我有一個給定的表作為輸入:
|CategoryPosition|CategoryId|CategoryName|CategoryItemId|CategoryItemName|CategoryItemPosition|
2| 10 |Gender |11 |Male |1
2| 10 |Gender |12 |Female |2
2| 10 |Gender |13 |N/A |3
1| 7 |Hours |34 |0 - 11 |1
1| 7 |Hours |35 |12 - 39|2
1| 7 |Hours |36 |40 - 79|3
1| 7 |Hours |37 |80 - 119|4
1| 7 |Hours |38 |120 |5
0| 5 |Age |51 |16-18 |1
0| 5 |Age |52 |19-24 |2
0| 5 |Age |53 |25-44 |3
0| 5 |Age |54 |45-54 |4
0| 5 |Age |55 |55-59 |5
0| 5 |Age |56 |60 |6
總行數:3(來自 Gender 的專案數) 5(來自 hours 的專案數) 6(來自 Age 的專案數)= 14
我需要生成一個輸出表,使用來自如下 3 個類別的專案組合組。
|GroupPos|CategoryPosition|CategoryId|CategoryName|CategoryItemPosition|CategoryItemId|CategoryItemName|
1 |0 |5 |Age |1 |51|16-18
1 |1 |7 |Hours |1 |34|0 - 11
1 |2 |10 |Gender |1 |11|Male
2 |0 |5 |Age |2 |52|19-24
2 |1 |7 |Hours |1 |34|0 - 11
2 |2 |10 |Gender |1 |11|Male
3 |0 |5 |Age |3 |53|25-44
3 |1 |7 |Hours |1 |34|0 - 11
3 |2 |10 |Gender |1 |11|Male
......
總行數:3(來自 Gender 的專案數)* 5(來自 hours 的專案數)* 6(來自 Age 的專案數)* 3(類別數)= 270
uj5u.com熱心網友回復:
你想要一種交叉連接加上逆樞軸
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
uj5u.com熱心網友回復:
選擇不同的屬性就像處理不同的表一樣:
with g as (select categoryitemname as gender from mytable where categoryname = 'Gender')
, h as (select categoryitemname as hours from mytable where categoryname = 'Hours')
, a as (select categoryitemname as age from mytable where categoryname = 'Age')
select *
from g cross join h cross join a
order by g.gender, h.hours, a.age;
如果需要,向子查詢添加更多列。結果看起來與您顯示的期望結果不同,但我認為這或多或少是您真正想要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316289.html
標籤:sql sql-server
上一篇:SQL將多行轉換為不同的列
下一篇:在sql中你如何只列印最常出現的
