2013-06-12 2 views
2

У меня есть 3 таблицы, и я пытаюсь создать отчет ...Добавить несколько столбцов VARCHAR

Table MP (data table) 
mID col1 col2 
1 data1 data2 
2 data3 data4 
3 data5 data6 

Table MPU (user table) 
uID UserName 
1 user1 
2 user2 
3 user3 

Table MPR (lookup table) 
rID uID mID 
1 1 2 
2 2 2 
3 1 1 

Это основная логика выбора мне нужно (подзапрос/цикл):

Select 
    MP.mID 
    ,MP.col1 
    ,MP.col2 
    ,MPU.UserName --format as 'user1, user2, user3' ... 
From MP 
left join MPR on MPR.mID = MP.mID 
left join MPU on MPU.uID = MPR.uID 

Мне нужно добавить строки имени пользователя вместе, как указано в коде.
Некоторые строки данных не будут иметь пользователей, а другие могут иметь до 10.
Я не хочу, чтобы несколько строк были заполнены так, как сейчас.

EDIT:
Примечание - SQL 2000

+0

Вы могли бы хотеть попробовать сливаться .. что бы объединить все не пустые имена пользователей .. Я буду искать формат и опубликовать его позже. – logixologist

+0

Существуют различные решения, такие как [this] (http://stackoverflow.com/questions/2046037/sql-server-can-i-comma-delimit-multiple-rows -into-one-column) для создания списков с разделителями-запятыми. FYI: В вашей таблице «MP» нет столбца «rID», но ваш запрос использует его. – HABO

+0

Это решение работает только на 2005 год и новее. Мне так повезло, что я работаю в 2000 году. – McG369

ответ

0

я могу предложить только этот подход к MSSQL 2000:

select 
    mID, 
    col1, 
    col2, 
    MAX(CASE seq WHEN 1 THEN UserName ELSE '' END) + 
    MAX(CASE seq WHEN 2 THEN ', '+UserName ELSE '' END) + 
    MAX(CASE seq WHEN 3 THEN ', '+UserName ELSE '' END) + 
    MAX(CASE seq WHEN 4 THEN ', '+UserName ELSE '' END) + 
    MAX(CASE seq WHEN 5 THEN ', '+UserName ELSE '' END) + 
    MAX(CASE seq WHEN 6 THEN ', '+UserName ELSE '' END) + 
    MAX(CASE seq WHEN 7 THEN ', '+UserName ELSE '' END) + 
    MAX(CASE seq WHEN 8 THEN ', '+UserName ELSE '' END) + 
    MAX(CASE seq WHEN 9 THEN ', '+UserName ELSE '' END) + 
    MAX(CASE seq WHEN 10 THEN ', '+UserName ELSE '' END) 

FROM (
    Select 
     MP1.mID, 
     MP1.col1, 
     MP1.col2, 
     MPU1.UserName, 
     (
      SELECT COUNT(*) 
      From MP as MP2 
      left join MPR as MPR2 on MPR2.mID = MP2.mID 
      left join MPU as MPU2 on MPU2.uID = MPR2.uID 
      WHERE MP2.mID = MP1.mID 
      AND MPU2.UserName <= MPU1.UserName 
     ) seq 
    From MP as MP1 
    left join MPR as MPR1 on MPR1.mID = MP1.mID 
    left join MPU as MPU1 on MPU1.uID = MPR1.uID 
) t1 
GROUP BY mID, col1, col2; 
Смежные вопросы