1

私はOracle 11Gを使用しています。以下のテーブル構造があります

STATE_DEF テーブルは親テーブルです

TAX_DEF_ID  EFFECTIVE_DATE  REP_TYPE
1           9-Jan-12        R
2           15-Jan-12       W

以下のように、子テーブル「TAX_DETAIL」

TAX_DETAIL_ID   TAX_TYPE    DISTRIBUTION_TYPE   WH_RATE   TAX_DEF_ID
1               I           S                   0.1       1
2               I           P                   0.12      1
3               D           S                   0.2       1
4               D           P                   0.22      1
5               I           S                   0.3       2
6               I           P                   0.31      2
7               D           S                   0.4       2
8               D           P                   0.41      2

以下に示す出力が得られるビューを作成したい

TAX_DEF_ID  EFFECTIVE_DATE  I_S_WH_RATE    I_P_WH_RATE  D_S_WH_RATE   D_P_WH_RATE
1           9-Jan-12        0.1            0.12         0.2           0.22
2           15-Jan-12       0.3            0.31         0.4           0.41

LISTAGG 関数を試してみましたが、連結された列を持つ単一の列が得られます。発効日の別の列に料金を表示するビュー定義を探しています。

私は数日からこの出力を得ようとしています。上記の結果を達成するための助けをいただければ幸いです。

4

4 に答える 4

1

を使用して結果を確認してくださいPIVOT

select * From(
  select 
    a.TAX_DEF_ID, 
    a.EFFECTIVE_DATE, 
    TAX_TYPE||DISTRIBUTION_TYPE AS TYP, 
    WH_RATE 
  From STATE_DEF a INNER JOIN TAX_DETAIL b ON a.TAX_DEF_ID=b.TAX_DEF_ID
)x 
PIVOT
(MAX(WH_RATE) as WH_RATE for (TYP) IN ('IS' AS I_S, 'IP' as I_P, 'DS' as D_S, 'DP' as D_P)); 
于 2013-01-24T07:44:21.400 に答える
1

これを試して:

SELECT
    SD.TAX_DEF_ID,
    SD.EFFECTIVE_DATE,
    SUM(CASE WHEN TAX_TYPE = 'I' AND DISTRIBUTION_TYPE = 'S' THEN WH_RATE ELSE 0 END) I_S_WH_RATE,
    SUM(CASE WHEN TAX_TYPE = 'I' AND DISTRIBUTION_TYPE = 'P' THEN WH_RATE ELSE 0 END) I_P_WH_RATE,
    SUM(CASE WHEN TAX_TYPE = 'D' AND DISTRIBUTION_TYPE = 'S' THEN WH_RATE ELSE 0 END) D_S_WH_RATE,
    SUM(CASE WHEN TAX_TYPE = 'D' AND DISTRIBUTION_TYPE = 'P' THEN WH_RATE ELSE 0 END) D_P_WH_RATE
FROM STATE_DEF SD
    LEFT JOIN TAX_DETAIL TD
        ON SD.TAX_DEF_ID = TD.TAX_DEF_ID
GROUP BY SD.TAX_DEF_ID, SD.EFFECTIVE_DATE
于 2013-01-24T07:24:54.250 に答える
0

11g では、これをピボットできます。

with data as (select s.TAX_DEF_ID, s.EFFECTIVE_DATE, d.TAX_TYPE, d.DISTRIBUTION_TYPE, d.WH_RATE
                from state_def s
                     inner join tax_detail d
                             on s.tax_def_id = d.tax_def_id)
select *
  from data
       pivot(max(wh_rate)
             for (TAX_TYPE, DISTRIBUTION_TYPE)
             in (('I', 'S') as I_S_WH_RATE,
                 ('I', 'P') as I_P_WH_RATE,
                 ('D', 'S') as D_S_WH_RATE,
                 ('D', 'P') as D_P_WH_RATE
                )
            );
于 2013-01-24T07:27:44.200 に答える
0
select 
  tax_def_id,
  effective_date,
  sum(case when d.tax_type='I' and d.distribution_type='S' then wh_rate end) as I_S_WH_RATE
  --and so on...
from state_def t
join tax_detail d on (t.tax_def_id = d.tax_def_id)
group by   
   tax_def_id, 
   effective_date
于 2013-01-24T07:23:38.190 に答える