1

特定の製品のIDとスコアを生成するために次のクエリがあります

Select
  tm.product_id,
  listagg(tm.book_id || '(' || tm.score || ')',',')
    within group (order by tm.product_id) as matches
from
  tl_product_match tm 
where
  tm.book_id is not null 
group by
  tm.product_id
union 
Select
  stm.product_id,
  listagg(stm.video_id || '(' || stm.score || ')',',')
    within group (order by stm.product_id) as matches
from
  tl_product_match stm
where
  stm.video_id is not null
group by
  stm.product_id

クエリは、次のような出力を生成します。

productId | matches
---------------------------------------------
1         | 123(30), 76565, 7687(500), 243(5)
2         | 352(30), 9(5), 34234(500), 43(5)
2         | 25(30), 78, 324(500), 23434(5)
3         | 546(30), 768, 34234(500), 324(5)

2つの質問:

  • クエリを変更してユニオンを削除しても同じ結果を生成することは可能ですか?
  • ProductId 2が2回繰り返されます(つまり、ユニオンごとに1行)。同じ行にproductId 2を表示するにはどうすればよいですか?すなわち

    productId |  matches
    -----------------------------------------------------------------------------
    1         |  123(30), 76565, 7687(500), 243(5)
    2         |  352(30), 9(5), 34234(500), 43(5), 25(30), 78, 324(500), 23434(5)
    3         |  546(30), 768, 34234(500), 324(5) 
    

前もって感謝します。

4

1 に答える 1

2

book_idとが同じタイプの場合、video_idこれを使用できます。

SELECT
   product_id ,listagg(gr_id || '(' || score || ')',',') within group (order by product_id) as matches
FROM
(
    SELECT
       product_id, score, book_id gr_id
    FROM tl_product_match
    WHERE book_id is not null 
    UNION ALL
    SELECT
       product_id, score, video_id gr_id
    FROM tl_product_match
    WHERE video_id is not null
) A
GROUP BY product_id

各行には、本またはビデオに関する情報が含まれていると思います。これはうまくいくかもしれません。

SELECT
    product_id,
    listagg(COALESCE(book_id, video_id) || '(' || score || ')',',') within group (order by product_id) as matches
FROM tl_product_match
GROUP BY product_id
于 2013-01-26T16:27:34.637 に答える