2013-04-16 2 views
2

У меня есть таблица SchoolStudent с тремя столбцами и следующих значенияОбъединить Статические столбцы с динамическим Колонным SQL SERVER 2008

enter image description here

Теперь, для студента, мы можем иметь динамические столбцы, которые хранятся в таблице со значениями как:

enter image description here

Я хочу, чтобы запрос, где я могу клуб статические поля, а также динамические поля в одном запросе SQL. Я пытался использовать Pivot, но не был успешным. Пожалуйста, предложите, как это осуществить. Я в основном делаю это так, что на frontend у меня есть один набор результатов, который можно найти через.

Так запрос должен быть:

Select 
    StudentID, FirstName, Address, MotherName, 
    MotherEmail, MotherOccupation, Mother Salary, 
    FacebookProfileName, VehicleRegNo 
from SchoolStudent 
Inner Join 
    (Logic to convert rows to columns) 
+0

Я предлагаю вам использовать и целочисленный идентификатор, который будет представлять тип значения, хранящегося ИНТ строки на второй таблице вместо DynamicColumnaName, потому что это поможет устранить избыточность и повысить согласованность данных которые вы пытаетесь сохранить. –

+0

Да, это целое число. Таблица представляет собой упрощение результата объединения двух таблиц. – rohit

ответ

2

Поскольку у вас есть динамические столбцы, вам нужно будет использовать динамический SQL для генерации желаемого результата. Этот запрос будет генерировать список столбцов во второй таблице и откинуть их затем присоединился к SchoolStudent, чтобы получить другие столбцы:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(DynamicColumnName) 
        from StudentDetails 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = ' 
     select s.studentid, 
      s.firstname, 
      s.address, 
      d.* 
     from SchoolStudent s 
     inner join 
     (
      SELECT studentId,' + @cols + ' 
      from 
      (
       select studentId, dynamiccolumnname, 
        dynamiccolumnvalue 
       from StudentDetails 
      ) x 
      pivot 
      (
       max(dynamiccolumnvalue) 
       for dynamiccolumnname in (' + @cols + ') 
      ) p 
     ) d 
      on s.StudentId = d.StudentId' 

execute(@query); 

См SQL Fiddle with Demo. Этот запрос дает результат:

| STUDENTID | FIRSTNAME | ADDRESS | FACEBOOK PROFILE NAME | MOTHER EMAIL | MOTHER NAME | MOTHER OCCUPATION | MOTHER SALARY | VEHICLE REG NO | 
----------------------------------------------------------------------------------------------------------------------------------------------- 
|   4 |  admin | efewfwfew |     ross | [email protected] | [email protected] |  [email protected] | [email protected] |  UP 14 as | 
1

Вы можете использовать вспомогательный формат запроса, как это:

SELECT t1.StudentID, 
     t1.FirstName, 
     t1.Address, 
     (SELECT t2.DynamicColumnValue FROM table2 t2 WHERE t2.StudentID = t1.StudentID AND t2.DynamicColumnName = 'Mother Name') AS 'MotherName', 
     (SELECT t2.DynamicColumnValue FROM table2 t2 WHERE t2.StudentID = t1.StudentID AND t2.DynamicColumnName = 'Mother Email') AS 'MotherEmail' 
FROM Table1 t1 

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

SELECT t1.StudentID, 
     t1.FirstName, 
     t1.Address, 
     t2.DynamicColumnValue AS 'MotherName' 
     t3.DynamicColumnValue AS 'MotherEmail' 
FROM Table1 t1 
INNER JOIN Table2 t2 ON t1.StudentID = t2.StudentID AND t2.DynamicColumnName = 'Mother Name' 
INNER JOIN Table2 t3 ON t1.StudentID = t3.StudentID AND t2.DynamicColumnName = 'Mother Email' 
+0

Спасибо за указание в правильном направлении, однако, поскольку динамических столбцов может быть много, и это будет динамическое решение, поэтому я думаю, что мне придется использовать динамические запросы в сочетании с вашим решением, чтобы перечислить все динамические столбцы в списке выбора. Любые мысли по этому поводу? – rohit

+0

Ahmm Я считаю, что вы пытаетесь реализовать что-то, что круто. Лично я просто делаю такие вещи, когда мне нужно нормализовать свою информацию, и я не очень хорошо знаком с динамическими запросами. извините, если я не смог передать то, что вам нужно;) .. Я тоже буду рад видеть элегантное решение для вашего вопроса. –

1

С некоторые динамические sql, вы можете сделать это:

DECLARE @cols NVARCHAR(2000) 
SELECT @cols = STUFF((SELECT DISTINCT '],[' + DynamicColumnName FROM DynamicValues ORDER BY '],[' + DynamicColumnName FOR XML PATH('')), 1, 2, '') + ']' 

DECLARE @query NVARCHAR(4000); 
SET @query = N'select s.StudentID, s.FirstName, s.Address,'[email protected]+' from SchoolStudent s 
join 
(
    select * from DynamicValues 
    pivot (Max(DynamicColumnValue) for DynamicColumnName in ('[email protected]+')) as pvt 
) as b on b.StudentID=s.StudentID' 
EXECUTE(@query) 
Смежные вопросы