3

私のselectステートメントの結果を次のようにしましょう(私はそれらのうちの5つを持っています):

   Id  Animal AnimalId
    1   Dog     Dog1
    1   Cat     Cat57

   Id  Transport TransportId
    2   Car        Car100
    2   Plane      Plane500

次のような結果が得られます。

   Id  Animal AnimalId    Transport    TransportId
    1   Dog     Dog1
    1   Cat     Cat57
    2                        Car          Car100
    2                       Plane         Plane500 

私にできることは、テーブル変数を作成し、可能なすべての列を指定して、各selectステートメントのレコードをその中に挿入できることです。しかし、おそらくPIVOTのようなより良い解決策ですか?
編集

クエリ:1番目:Select CategoryId as Id, Animal, AnimalId from Animal
2番目:Select CategoryId as Id, Transport, TransportId from Transport

4

5 に答える 5

5

これはどうですか。同じ行にそれらが必要な場合、これは各行のを取得し、row_number()それらに結合します。

select a.id,
  a.aname,
  a.aid,
  t.tname,
  t.tid
from 
(
  select id, aname, aid, row_number() over(order by aid) rn
  from animal
) a
left join
(
  select id, tname, tid, row_number() over(order by tid) rn
  from transport
) t
  on a.rn = t.rn

SQL FiddlewithDemoを参照してください

同じ行にそれらが必要ない場合は、次を使用しますUNION ALL

select id, aname, aid, 'Animal' tbl
from animal
union all
select id, tname, tid, 'Transport'
from transport

SQL FiddlewithDemoを参照してください

編集#1、これはとのあるバージョンUNPIVOTですPIVOT

select an_id, [aname], [aid], [tname], [tid]
from
(
  select *, row_number() over(partition by col order by col) rn
  from animal
  unpivot
  (
    value
    for col in (aname, aid)
  ) u
  union all
  select *, row_number() over(partition by col order by col) rn
  from transport
  unpivot
  (
    value
    for col in (tname, tid)
  ) u
) x1
pivot
(
  min(value)
  for col in([aname], [aid], [tname], [tid])
) p
order by an_id

SQL FiddlewithDemoを参照してください

于 2012-09-12T20:37:03.727 に答える
3

これはあなたのためにそれをするでしょう:

SELECT
ID, field1, field2, '' as field3, '' as field4
FROM sometable

UNION ALL

SELECT
ID, '', '', field3, field4
FROM someothertable
于 2012-09-12T20:37:27.153 に答える
0

ピボットする必要はありません。結果はすでに問題ありません。

必要に応じて、最初に選択したID / Category/CategoryIDと同じ形式で5つのステートメントすべてをUNIONすることができます。次に、5セットすべてに3列幅が追加された1つの長い結果セットが得られます。

それはあなたが望むものですか?または、「カテゴリ」を区別する必要がありますか?


あなたの例を考えて、試してみてください:

Select CategoryId as Id, Animal, AnimalId from Animal
union all
Select CategoryId as Id, Transport, TransportId from Transport

必要に応じて、次のように列にエイリアスを設定できます。

Select CategoryId as Id, Animal as category, AnimalId as categoryID from Animal
union all
Select CategoryId as Id, Transport, TransportId from Transport

本当にピボットする必要はありません。最初に考えていたように、列の間隔を空けるだけです。列を移動するためにピボットするのではなく、グループ化されたデータに対して集計関数を実行するためにピボットします。

于 2012-09-12T20:35:41.027 に答える
0
create table Animal (
    Animal varchar(50)
    ,AnimalID varchar(50)
    )

create table Transport (
    Transport varchar(50)
    ,TransportID varchar(50)
    )

insert into Animal values ('Dog', 'Dog1')
insert into Animal values ('Cat', 'Cat57')

insert into Transport values ('Car', 'Car100')
insert into Transport values ('Plane', 'Plane500')


select  ID = 1
    ,A.Animal
    ,A.AnimalID
    ,Transport = ''
    ,TransportID = ''
from    Animal A

union

select  ID = 2
    ,Animal = ''
    ,AnimalID = ''
    ,T.Transport
    ,T.TransportID
from    Transport T
于 2012-09-12T20:43:56.553 に答える
0

必要な形式で取得するには、必要な値を選択してnullから、他の列(または空の文字列)を選択します。

SELECT
    CategoryId as Id, 
    Animal as 'Animal', 
    AnimalId as 'AnimalId',
    null as 'Transport',
    null as 'TransportId'
FROM Animal
UNION
SELECT 
    CategoryId as Id, 
    null as 'Animal',
    null as 'AnimalId',
    Transport as 'Transport',  
    TransportId as 'TransportId' 
FROM Transport

これの目的はまだわかりませんが、これで必要な出力が得られるはずです。

于 2012-09-12T20:50:06.110 に答える