簡體   English   中英

帶條件的 DB2/Sql 分組

[英]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

在 DB Fiddle 上查看

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM