2013-12-07 2 views
0

Привет У меня возникла проблема с выбором моего желаемого результата в моей программе.SQL Выберите COLUMNS в одной строке с внутренним соединением

Вот сценарий:

У меня есть 2 таблицы

_Users

_Mobiles

Допустим, у меня есть эти поля и данные в каждой таблицах:

_Users

**UserID**  **Name** 
     1    John 
     2    Mark 

_Mobiles

**UserID**  **Mobile** 
     1    44897065 
     1    44897066 
     1    44897067 
     2    45789071 

То, что я знаю, что я могу использовать

Select a.UserID, b.Mobile 
from _Users a INNER JOIN 
_Mobiles b ON a.UserID = b.UserID 
where UserID = 1 

, который будет извлекать данные в этом формате:

UserID Mobile

1 44897065 
1 44897066 
1 44897067 

но что я хотите организовать данные:

UserID Mobile1 Mobile2 Mobile3 
    1  44897066 44897065 44897065 

и если другой мобильный для одного пользователя кодируется, он будет выводиться в Mobile4 и так далее ..

Я знаю, что это странно, но я хочу сделать это по какой-то причине: D ли это возможно, и может кто-нибудь помочь мне, как это сделать. Большое вам спасибо.

+0

Если вы находитесь в 'SQL server' можно поворачивать it.Can указать, какие базы данных ты используешь ? –

+0

Если вы используете MySql, вы смотрите на 'GROUP_CONCAT', это не совсем то, что вам нужно, но это может помочь вам – Uriil

+0

Привет, @snyder Я использую SQL-сервер 2012. Спасибо. Я буду исследовать о стержне, но если вы можете, простые примеры будем благодарны, спасибо. –

ответ

0

попробовать это Sql запрос ..

DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(a.MobileCategory) 
       from 
       (
       Select a.UserID as UserID, b.Mobile as Mobile,'Mobile'+ CAST(ROW_NUMBER() OVER(ORDER BY b.Mobile) AS VARCHAR) AS MobileCategory 
       FROM _Users a INNER JOIN 
       _Mobiles b ON a.UserID = b.UserID 
       WHERE a.UserID = 1 
      ) a 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'SELECT UserID,' + @cols + ' from 
      (
       Select a.UserID as UserID,b.Mobile as Mobile,''Mobile''+ CAST(ROW_NUMBER() OVER(ORDER BY b.Mobile) AS VARCHAR) AS MobileCategory 
       FROM _Users a INNER JOIN 
       _Mobiles b ON a.UserID = b.UserID 
       WHERE a.UserID = 1 
      ) x 
      pivot 
      (
       sum(Mobile) 
       for MobileCategory in (' + @cols + ') 
      ) p ' 

execute(@query) 
0

Это может использовать помощь, но что-то вроде этого

with (
    select u.userid, m1.mobid, m2.mobid, .. mN.mobid 
     from users u 
     left join mobiles m1 
     on u.userid=m1.userid 
     left join mobiles m2 
     on u.userid=m2.userid 
     ... 
     left join mobiles mN 
     on u.userid=mN.userid 
    ) as mobuser 
    select * from mobuser 
    where (m2.mobid>m1.mobid or m2.mobid is null) 
     and (m3.mobid>m2.mobid or m3.mobid is null) 
     ... 
     and (mN.mobid>mNMinus1.mobid or mN.mobid is null) 
Смежные вопросы