1

次のようなテーブルがあります。

BRAND_ID PRODUCT_ID PRODUCT_DESC PRODUCT_TYPE
100      1000       Tools        A
100      1500       Tools        A 
200      2000       Burgers      B
300      3000       Clothing     C
300      4000       Makeup       D
300      5000       Clothing     C

そのため、ブランドには、すべて同じタイプまたは混合タイプの複数の製品を含めることができます。ブランドの製品がすべて同じタイプである場合、結果の最初にそれらが必要であり、製品タイプでソートされ、次に製品タイプが異なるブランドが続きます。これはプログラムで行うことができますが、クエリでそれを行う方法があるかどうかを確認したかったのです。

4

2 に答える 2

1

ブランド数を割り出すサブセレクトから選んで、その数でソートしてみてはいかがでしょうか。

select t.BRAND_ID, 
       t.PRODUCT_ID, 
       t.PRODUCT_DESC, 
       t.PRODUCT_TYPE
  from (select t2.BRAND_ID, 
               t2.PRODUCT_ID, 
               count(distinct t2.PRODUCT_TYPE) cnt
          from YOURTABLE t2
         group by t2.BRAND_ID, t2.PRODUCT_ID) data
  join YOURTABLE t on t.BRAND_ID = data.BRAND_ID and t.PRODUCT_ID = data.PRODUCT_ID
 order by data.cnt, BRAND_ID, PRODUCT_ID, PRODUCT_TYPE
于 2012-05-15T15:46:32.253 に答える
1

私はOracleにアクセスできませんが、これらの線に沿った何かがうまくいくと信じています...

WITH
  ranked_data
AS
(
  SELECT
    COUNT(DISTINCT product_type) OVER (PARTITION BY brand_id)  AS brand_rank,
    MIN(product_type)            OVER (PARTITION BY brand_id)  AS first_product_type,
    *
  FROM
    yourTable
)
SELECT
  *
FROM
  ranked_data
ORDER BY
  brand_rank,
  first_product_type,
  brand_id,
  product_type,
  product_description


別の方法は、サブクエリに JOIN して 2 つの並べ替えフィールドを計算することです。

SELECT
  yourTable.*
FROM
  yourTable
INNER JOIN
(
  SELECT
    brand_id,
    COUNT(DISTINCT product_type) AS brand_rank,
    MIN(product_type)            AS first_product_type,
  FROM
    yourTable
  GROUP BY
    brand_id
)
  AS brand_summary
    ON yourTable.brand_id = brand_summary.brand_id
ORDER BY
  brand_summary.brand_rank,
  brand_summary.first_product_type,
  yourTable.brand_id,
  yourTable.product_type,
  yourTable.product_description
于 2012-05-15T15:36:41.920 に答える