2013-12-07 2 views
0

Мне удалось совместить результаты с помощью функции поворота. Пробовал различные примеры моего решения, чтобы объединить эти результаты вместе. Я делаю это неправильно или это простое решение?Как сгруппировать опорные результаты в SQL?

create table DBE_LOCATION 
(
REF int, 
STATUS varchar(1) 
); 

insert into DBE_LOCATION values 
(1, 'A'), 
(2, 'A'); 

create table SYS_SCREEN_FIELD 
(
REF int, 
FIELD_DISPLAY varchar(20), 
ORDER_BY int 
); 

insert into SYS_SCREEN_FIELD values 
(1, 'Location Name', 0), 
(2, 'Address', 1), 
(3, 'Suburb', 2), 
(4, 'Postcode', 3), 
(5, 'State', 4), 
(6, 'Country', 5); 

create table DBE_LOCATION_DATA 
(
REF int, 
FIELD_REF int, 
LOCATION_REF int, 
VALUE_TEXT_FIELD varchar(MAX) 
); 

insert into DBE_LOCATION_DATA values 
(1, 1, 1, 'New York'), 
(2, 1, 2, 'Japan'), 
(3, 2, 1, '123 Address St'), 
(4, 2, 2, '456 Address St'); 

Теперь последнее, что бы показать результирующий набор каждого места с отображением поля в качестве имени столбца. Что-то вроде этого, используя приведенный выше пример:

 
Ref Location Name Address     Status 
1  New York    123 Address St  A 
2  Japan     456 Address Ave A

получили следующие работы в сборе данных и создания динамических столбцов:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(FIELD_DISPLAY) 
       from SYS_SCREEN_FIELD 
       group by FIELD_DISPLAY, ORDER_BY 
       order by ORDER_BY 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

set @query = 'SELECT REF, ' + @cols + ', STATUS from 
     (
      select l.REF, l.STATUS, 
       f.FIELD_DISPLAY, 
       d.FIELD_REF, d.VALUE_TEXT_FIELD 
      from DBE_LOCATION l 
      right join DBE_LOCATION_DATA d 
       on l.REF = d.LOCATION_REF 
      inner join SYS_SCREEN_FIELD f 
       on d.FIELD_REF = f.REF 
     ) x 
     pivot 
     (
      max(VALUE_TEXT_FIELD) 
      for FIELD_DISPLAY in (' + @cols + ') 
     ) p' 

execute(@query) 

Результаты не сгруппированы по REF. Как это делается?

SQL Fiddle Link

ответ

0

Проблема с добавлением столбца FIELD_REF в вашем подзапрос. Даже если вы не включаете этот столбец в свой окончательный список выбора, так как он находится в вашем подзапросе, столбец используется во время группировки PIVOT.

Вы можете увидеть проблему, если вы включите его в вашем окончательном выборе, вы получите результат:

| REF | FIELD_REF | LOCATION NAME |  ADDRESS | SUBURB | POSTCODE | STATE | COUNTRY | STATUS | 
|-----|-----------|---------------|----------------|--------|----------|--------|---------|--------| 
| 1 |   1 |  Adelaide |   (null) | (null) | (null) | (null) | (null) |  S | 
| 1 |   2 |  (null) | 1 Adelaide St | (null) | (null) | (null) | (null) |  S | 

FIELD_REF имеет значение 1 и 2 для REF=1, когда агрегат и группы по применяются , вы вернете несколько строк.

Если удалить этот столбец из вашего подзапроса, вы получите результат, который вы хотите:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(FIELD_DISPLAY) 
        from SYS_SCREEN_FIELD 
        group by FIELD_DISPLAY, ORDER_BY 
        order by ORDER_BY 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT REF, ' + @cols + ', STATUS from 
      (
       select l.REF, l.STATUS, 
        f.FIELD_DISPLAY, 
        d.VALUE_TEXT_FIELD 
       from DBE_LOCATION l 
       right join DBE_LOCATION_DATA d 
        on l.REF = d.LOCATION_REF 
       inner join SYS_SCREEN_FIELD f 
        on d.FIELD_REF = f.REF 
      ) x 
      pivot 
      (
       max(VALUE_TEXT_FIELD) 
       for FIELD_DISPLAY in (' + @cols + ') 
      ) p' 

execute sp_executesql @query; 

См SQL Fiddle with Demo. Теперь ваш окончательный результат:

| REF | LOCATION NAME |  ADDRESS | SUBURB | POSTCODE | STATE | COUNTRY | STATUS | 
|-----|---------------|----------------|--------|----------|--------|---------|--------| 
| 1 |  Adelaide | 1 Adelaide St | (null) | (null) | (null) | (null) |  S | 
| 2 |  Melbourne | 2 Melbourne St | (null) | (null) | (null) | (null) |  S | 
+0

Большое вам спасибо. Не мог этого видеть. Очень признателен. –

Смежные вопросы