2012-03-27 4 views
0

2つの列(1 - 文字列のタイプ、別のタイプ - 数字のタイプ)を持つ表が指定されています。私はクエリ(コマンド:joinとrownumを使用して)を必要とし、各行には2番目の列に指定された回数が与えられています。例えば :問合せでは、各行に2列目(sql、oracle)の数字が付与されました

col1 col2 
---- ---- 
apple 4 
melon 1 
banana 2 

結果:

apple 
apple 
apple 
apple 
melon 
banana 
banana 
+5

おはなしい神。彼らは今何をしたのですか – bernie

+1

これは何のSQLエンジンですか? MySQL? SQLサーバー?オラクル? DB2? – mellamokb

+3

「グループ化解除」機能... – Glenn

答えて

1

SQL Serverを仮定すると、これは、この例でsys.all_columnsを用いて(集計テーブルの賢明な使用により可能である、の大きさは、上の上限であります生成可能な行数)を計算し、インデックス番号範囲の部分和を計算すると次のようになります。

;with Ranges as (
    select 
     col1, 
     (select coalesce(sum(t2.col2), 0)+1 
      from MyTable t2 where t2.col1<t1.col1) as indexStart, 
     (select coalesce(sum(t2.col2), 0) 
      from MyTable t2 where t2.col1<=t1.col1) as indexEnd 
    from 
     MyTable t1 
) 
,TallyTable as (
    select 
     row_number() over (order by c.object_id, c.column_id) as number 
    from 
     sys.all_columns c 
) 
select 
    r.col1 
from 
    Ranges R, TallyTable T 
where 
    T.number between r.indexStart and r.indexEnd 

ただし、 OPのコメントでは、これは推奨されていません。あなたのビジネス上の問題に対するより良い解決策が存在する可能性は非常に高いです。

+0

ニース。別のスレッドから学んだように、PostgreSQLには、PostgreSQLバージョンのTallyTableの代わりになるgenerate_series関数が組み込まれています。 – Glenn

+0

答えはmellamokbに感謝します:)しかし、あなたはコマンド(join、rownum)を使ってこのクエリを書くことができますか?前もって感謝します! – Kopro

0

あなたが結果セットにカウンターを追加し、うまく

  • YourTableからすべての行を選択して仕事をするだろう再帰CTEを使用して、SQL Serverを使用していると仮定。指定した列の
  • 再帰カウンタがcol2

SQLステートメント

;WITH q AS (
    SELECT col1, cnt = 1 
    FROM YourTable 
    UNION ALL 
    SELECT q.col1, cnt + 1 
    FROM q 
      INNER JOIN YourTable yt ON yt.col1 = q.col1 
    WHERE cnt < yt.col2   
) 
SELECT col1 
FROM q 
OPTION (MAXRECURSION 0) 

テストスクリプトあなたが与えられていないとして

;WITH YourTable(col1, col2) AS (
    SELECT 'apple', 4 
    UNION ALL SELECT 'melon', 1 
    UNION ALL SELECT 'banana', 2 
) 
, q AS (
    SELECT col1, cnt = 1 
    FROM YourTable 
    UNION ALL 
    SELECT q.col1, cnt + 1 
    FROM q 
      INNER JOIN YourTable yt ON yt.col1 = q.col1 
    WHERE cnt < yt.col2   
) 
SELECT col1 
FROM q 
OPTION (MAXRECURSION 0) 
+2

SQL Serverが文の前に文の終了文字を必要とするという事実に慣れることはできません... –

0

DBMSでの値に達するまで私はPostgreSQLを仮定する:

with test_data (col1, col2) as (
    values ('apple', 4), ('melon', 1), ('banana', 2) 
) 
select col1 
from (
    select col1, generate_series(1, col2) 
    from test_data 
) t 
関連する問題