1

私はこの形式のデータを持っています:

department_id | VAT_id | Tax_amount | Net_amount | Gross_amount | Date     | Invoice_no
      1       |    3   |   10       |   90       |  100         | 20130101 |   A5
      1       |    8   |   5        |   35       |  40          | 20130101 |   A5
      3       |    3   |   5        |   45       |  50          | 20130101 |   A8

そして私はそれを次のように変換したいと思います:

Department_id | Vat_id | Amount | Date     | Invoice_No
1             |  3     |  10    | 20130101 |    A5
1             |  0     |  90    | 20130101 |    A5
1             | -1     |  100   | 20130101 |    A5
1             |  8     |  5     | 20130101 |    A5
1             |  0     |  35    | 20130101 |    A5
1             | -1     |  40    | 20130101 |    A5
3             |  3     |  5     | 20130101 |    A8
3             |  0     |  45    | 20130101 |    A8
3             | -1     |  50    | 20130101 |    A8   

Vat_id値0は正味額です

Vat_id値-1は総額です。

このデータを垂直化して、前進し続けるにはどうすればよいですか?

4

1 に答える 1

3

UNPIVOT関数を使用してこれを実行できます。

select department_id,
  case 
    when col = 'net_amount' then 0
    when col = 'Gross_amount' then -1
    else vat_id end vat_od,
  amount, 
  invoice_no
from yourtable
unpivot
(
  amount
  for col in ([Tax_amount], [Net_amount], [Gross_amount])
) unpiv

SQL Fiddle with Demoを参照してください。

アンピボット機能にアクセスできない場合は、UNION ALLクエリを使用できます。

select department_id,
  case 
    when col = 'net_amount' then 0
    when col = 'Gross_amount' then -1
    else vat_id end vat_od,
  amount, 
  invoice_no
from
(
  select department_id, vat_id, 
    'tax_amount' col, tax_amount amount, invoice_no
  from yourtable
  union all
  select department_id, vat_id, 
    'Net_amount' col, Net_amount amount, invoice_no
  from yourtable
  union all
  select department_id, vat_id, 
    'Gross_amount' col, Gross_amount amount, invoice_no
  from yourtable
) src

デモで SQL Fiddle を参照してください

どちらのクエリも次を返します。

| DEPARTMENT_ID | VAT_OD | AMOUNT | INVOICE_NO |
------------------------------------------------
|             1 |      3 |     10 |         A5 |
|             1 |      0 |     90 |         A5 |
|             1 |     -1 |    100 |         A5 |
|             1 |      8 |      5 |         A5 |
|             1 |      0 |     35 |         A5 |
|             1 |     -1 |     40 |         A5 |
|             3 |      3 |      5 |         A8 |
|             3 |      0 |     45 |         A8 |
|             3 |     -1 |     50 |         A8 |
于 2013-03-06T17:13:12.057 に答える