3

列のあるテーブルがあるとしますid, name, phone_type, phone_no

そして私は2つのレコードを持っています

{1, Tom, home, 123}
{2, Tom, mobile, 234}  

SQLを使用する場合:

SELECT * FROM table WHERE name = tom;

両方のレコードが表示されます。

ただし、次のように1行で表示したいと思います。

Tom, mobile,234,home,123

そんな感じ...

db2でSQLを変更するにはどうすればよいですか?

助けてください。

4

3 に答える 3

1

次に、OLAP 関数を使用したより一般的な例を示します。これにより、名前ごとに電話の種類と電話番号の最初の 4 つのペアが取得されます。誰かが 4 つ未満の場合、残りは NULL で埋められます。これを 4 つ以上に拡張する方法は明らかです。

select * from (
    select id,
           min(id) over (partition by name) as first_id,
           name,
           phone_type as phone_type1,
           phone_no as phone_no1,
           lead(phone_type,1) over (partition by name order by id) as phone_type2,
           lead(phone_no,1) over (partition by name order by id) as phone_type2,
           lead(phone_type,2) over (partition by name order by id) as phone_type3,
           lead(phone_no,2) over (partition by name order by id) as phone_type3,
           lead(phone_type,3) over (partition by name order by id) as phone_type4,
           lead(phone_no,3) over (partition by name order by id) as phone_type4
   from table
) where id = first_id

外側の選択により、1 人あたり 1 行のみが取得されることが保証されます。これが必要なのは、OLAP 関数 (この場合はmin(id)) の結果を直接 where 句に入れることができないためです。

于 2012-08-14T10:31:14.627 に答える
0

これはアイデアを与えるかもしれません

declare @rVal nvarchar(128)
set @rVal = 'Tom'
select @rVal = @rval + coalesce(',' + phoneType + ',' + convert(nvarchar,phoneNumber),'') from testTable where name = 'Tom'
select @rVal
于 2012-08-13T15:05:09.403 に答える
0

1 つの方法を次に示します。

select name,
       'mobile',
       max(case when ttype = 'mobile' then phone end) as mobilephone,
       'home',
       max(case when ttype = 'home' then phone end) as homephone
from t
group by name
于 2012-08-13T14:54:45.953 に答える