2013-12-07 9 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具有和12REF=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

非常感謝。看不到它。非常感激。 –