• ベストアンサー

同じ列に2行づつで出力するSQL

次のようなテーブルがあったとき no | name 1 | aaa 3 | bbb 4 | ccc 6 | ddd (先頭はカラム名です) 以下のように出力するSQLは書けますでしょうか? no1| name1 | no2| name2 1 | aaa | 3 | bbb 4 | ccc | 6 | ddd

質問者が選んだベストアンサー

  • ベストアンサー
noname#140971
noname#140971
回答No.3

列名は変更していますが、これは予約語を使いたくなかったからに過ぎません。 ID1__kname1__ID2__kname2 1_____aaa________3____bbb 4_____ccc________6____ddd SELECT ID1, kname1, ID2, kname2 FROM (SELECT [ID] AS ID1, [kname] AS kname1, DLookup("[ID]","tab1","ID>" & [ID]) AS ID2, DLookup("[kname]","tab1","ID>" & [ID]) AS kname2, DCount("*","tab1","ID<=" & [ID]) AS IDCount FROM tab1) AS Test WHERE (IDCount MOD 2)=1; Accessならば、こういうクエリでもOKです。 考え方としては、こういうことだと思います。 なお、一旦、登録すると次のようになるようです。 SELECT ID1, kname1, ID2, kname2 FROM [SELECT [ID] AS ID1, [kname] AS kname1, DLookup("[ID]","tab1","ID>" & [ID]) AS ID2, DLookup("[kname]","tab1","ID>" & [ID]) AS kname2, DCount("*","tab1","ID<=" & [ID]) AS IDCount FROM tab1]. AS Test WHERE (IDCount MOD 2)=1;

rakudan
質問者

お礼

ありがとうございます。 なんとかできました。 DLookUpはよく分かりませんが、以下のように書き直してうまくいきました。 SELECT ID AS ID1,KNAME AS KNAME1, (SELECT FIRST ID FROM TAB1 WHERE ID>ID1 ORDER BY ID) AS ID2, (SELECT FIRST KNAME FROM TAB1 WHERE ID>ID1 ORDER BY ID) AS KNAME2, (SELECT COUNT(*) FROM TAB1 WHERE ID<=ID1) AS CID FROM TAB1 WHERE MOD(CID,2)=1

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>無理を承知でお願いします。 ということであれば、SQLに何を使用しているか書くべきです。 SQLの本来の作業ではないので、SQLの種類やバージョンによって 書き方が大幅に異なります。 ロジックとしては、 (1)連番を振る (2)連番を2でわって、あまり0が左、あまり1が右にくるようJOINする なんてのでどうでしょう。

rakudan
質問者

お礼

>ということであれば、SQLに何を使用しているか書くべきです。 確かにそのとおりでした。 SQL99でお願いします。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

それはSQLの仕事ではありません。 もちろん無理を承知でやることは不可能ではありませんが できればミドルウェアやアプリケーション側でやってください。

rakudan
質問者

お礼

無理を承知でお願いします。

関連するQ&A