[英]DB2/Sql grouping with condition
我有一個非常簡單的 sql 查詢,我正在 DB2 I 系列 4 上運行,它只是執行一些簡單的連接。 問題是我的材料表有它,因此可以在每個作品上使用多種材料/顏色組合。 現在我正在獲取每個組合的行,但我想合並以便如果 test.materials.sequence 的值為 2 那么它會創建兩個額外的列(如果組合沒有序列 2 那么它只是 0 和0 在這些列中。
查詢:
Select bod.code, mat.material, mat.mat_color,
from test.skus sk
inner join test.Bodies bod on sk.body_id = bod.id
inner join test.categories prc on prc.id = sk.category_id
inner join test.skus_to_materials stm on sk.id = stm.sku_id
inner join test.materials mat on stm.mat_id = mat.id
order by prc.desc;
表:
存貨單位
id | code | body_id | category_id
-------------------------------------------
1 12345 9912 3
2. 12346 9913 3
身體
id | code
--------------------------
9912 1234-5
9913 1234-6
類別
id | category
------------------
3 Test
skus_to_materials
id | sku_id | mat_id | sequence
--------------------------------------
1 1 221 1
2 1 222 2
3 2 223 1
材料
id | material | mat_color
-------------------------------
221 Fabric black
222 Fabric white
223 Leather brown
這是我目前的結果:
code | material | mat_color
-------------------------
1234-5 | Fabric | black
1234-5 | Fabric | white
這是我想要的結果:
code | material1 | mat_color1 | material2 | mat_color2
----------------------------------------------------------
1234-5 Fabric black Fabric white
1234-6 Leather brown 0 0
查看 1234-6 如何只有一種材料組合,因此 material2 和 mat_color2 將為零。
有沒有辦法通過分組和行操作來實現這一點?
更新:
在回答查爾斯的回答時,我在一個案例中發現了一些數據更多的問題。 按材料、顏色和描述分組后,我意識到我得到了丟失的記錄,但現在遇到了這個問題:
code | material1 | color1 | material2 | color2
------------------------------------------------------------
1234-5 Fabric White 0 0
1234-5 0 0 Leather white
1234-5 Leather Brown 0 0
1234-5 Leather Tan 0 0
1234-6 Fabric Black 0 0
1234-6 0 0 Leather Black
1234-7 Fabric White 0 0
“行到列”被稱為“旋轉”數據。
IBM i 的 Db2 沒有針對 pivot 的內置方法。但是,假設有一組不同的值,您可以對其進行硬編碼。
像這樣的事情應該做你想做的:
Select bod.code, max(mat1.material), max(mat1.mat_color),
max(mat2.material), max(mat2.mat_color)
from test.skus sk
inner join test.Bodies bod on sk.body_id = bod.id
inner join test.categories prc on prc.id = sk.category_id
inner join test.skus_to_materials stm on sk.id = stm.sku_id
inner join test.materials mat1 on stm.mat_id = mat1.id
and mat1.sequence = 1
left outer join test.materials mat2 on stm.mat_id = mat2.id
and mat2.sequence = 2
group by bod.code
order by prc.desc;
編輯好的,如果序列實際上在skus_to_materials
中,那么您將需要一組不同的連接。 實際上,在那種情況下,我可能只是 go 帶有基於 CTE 的語句。
with allrows as (
Select bod.code, prc.desc, stm.sequence
, mat.material, mat.mat_color,
from test.skus sk
inner join test.Bodies bod on sk.body_id = bod.id
inner join test.categories prc on prc.id = sk.category_id
inner join test.skus_to_materials stm on sk.id = stm.sku_id
inner join test.materials mat on stm.mat_id = mat.id
}
select
code
, max(case when sequence = 1 then material else '0' end) as material1
, max(case when sequence = 1 then color else '0' end) as color1
, max(case when sequence = 2 then material else '0' end) as material2
, max(case when sequence = 2 then color else '0' end) as color2
from allRows
group by code
order by desc;
我認為查爾斯的第一個答案更接近。 這是我得到的:
SELECT SK.ID SKU
,BOD.CODE
,MAT.MATERIAL MATERIAL_1
,MAT.MAT_COLOR MATERIAL_2
,COALESCE(MAT2.MATERIAL, '0') MATERIAL_2
,COALESCE(MAT2.MAT_COLOR, '0') COLOR_2
FROM SKUS SK
INNER JOIN BODIES BOD ON SK.BODY_ID = BOD.ID
INNER JOIN CATEGORIES PRC ON PRC.ID = SK.CATEGORY_ID
INNER JOIN SKUS_TO_MATERIALS STM ON SK.ID = STM.SKU_ID AND STM.SEQUENCE = 1
INNER JOIN MATERIALS MAT ON STM.MAT_ID = MAT.ID
LEFT JOIN SKUS_TO_MATERIALS STM2 ON SK.ID = STM2.SKU_ID AND STM2.SEQUENCE = 2
LEFT JOIN MATERIALS MAT2 ON STM2.MAT_ID = MAT2.ID;
導致:
存貨單位 | 代碼 | 材料_1 | 材料_2 | 材料_2 | 顏色_2 |
---|---|---|---|---|---|
6個 | BodD | 織物 | 黑色的 | 0 | 0 |
4個 | BodB | 織物 | 黑色的 | 皮革 | 黑色的 |
3個 | 美國銀行 | 織物 | 黑色的 | 0 | 0 |
2個 | 美國銀行 | 織物 | 黑色的 | 皮革 | 黑色的 |
1個 | 美國銀行 | 織物 | 黑色的 | 0 | 0 |
1個 | 美國銀行 | 織物 | 白色的 | 0 | 0 |
5個 | 中央銀行 | 皮革 | 棕色的 | 0 | 0 |
1個 | 美國銀行 | 皮革 | 棕色的 | 0 | 0 |
1個 | 美國銀行 | 皮革 | 黑色的 | 0 | 0 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.