多列SQL Server上的PIVOT(Aspen中继数据库)

时间:2018-08-23 11:29:28

标签: sql sql-server pivot cross-apply

我正在使用供应商提供的中继数据库(Aspen),该数据库正在MS SQL服务器上运行。我正在尝试编写需要在2列上进行数据透视的数据透视查询。

我创建了一个临时表,因为数据跨多个表。

WITH TEMP_TABLE AS (
  SELECT 
    R.LOCATIONID LLOCATIONID, R.ID RID, s.groupname SGROUPNAME,t.settingname TSETTINGNAME, s.setting SSETTING
from tsetting1 s
inner join tsettype1 t on t.relaytype=s.relaytype and t.groupname = s.groupname and t.rownumber = s.rownumber
INNER JOIN TREQUEST Q ON S.REQUESTID = Q.ID
INNER JOIN TRELAY R ON R.ID = Q.RELAYID
INNER JOIN TLOCATION L ON L.ID = R.LOCATIONID
where s.requestid=29117
)
select  * from TEMP_TABLE

从Temp中选择所有内容将返回38行数据,此处显示一个子集:

RID -----SGROUPNAME------TSETTINGNAME-------SSETTING
31297    LOAD1            ENABLE             TRUE
31297    LOAD1            ANGLE              60
31297    LOAD2            CALCULATED_LOAD    12269
ETC....

我添加了这个关键点,这使我很贴心:

PIVOT (MAX(SSETTING) FOR TSETTINGNAME IN (ENABLE, REACH, ANGLE, CALCULATED_LOADABILITY, ZLE, CTR, PTR, KVNOM, PICKUP, PERCENTAGE)) P

Pivot返回的结果:

RID-----SGROUPNAME-----ENABLE----REACH----ANGLE----CALCULATED_LOADABILITY
31297   LOAD1          TRUE      15       60       9444
31297   LOAD2          TRUE      10       30       12269
31297   LOAD3          TRUE      20       60       14167
ETC...

我希望将数据作为RID 31297的1条记录,其中LOAD1-ENABLE,LOAD2-ENABLE,LOAD3-ENABLE,LOAD1-REACH,ETC。都是标题。

我尝试了多个枢轴并交叉应用,但似乎无法正确显示数据。

让我知道是否有任何不清楚的地方,或者是否需要更多信息。任何帮助将不胜感激。

谢谢, 乔C。

1 个答案:

答案 0 :(得分:0)

使用一堆case语句和一个RID分组可能会更容易。顺便说一句,这是在实施PIVOT之前进行枢转的“原始”方法。

select RID
   , Load1_Enable = MAX(case when SGROUPNAME = 'Load1' then enable else null end)
   , Load2_Enable = MAX(case when SGROUPNAME = 'Load2' then enable else null end)
from [YourTable]
group by RID

尽管如此,我还是会一直走到第一个cte:

WITH TEMP_TABLE AS (
  SELECT 
    R.LOCATIONID LLOCATIONID, R.ID RID, s.groupname SGROUPNAME,t.settingname TSETTINGNAME, s.setting SSETTING
from tsetting1 s
inner join tsettype1 t on t.relaytype=s.relaytype and t.groupname = s.groupname and t.rownumber = s.rownumber
INNER JOIN TREQUEST Q ON S.REQUESTID = Q.ID
INNER JOIN TRELAY R ON R.ID = Q.RELAYID
INNER JOIN TLOCATION L ON L.ID = R.LOCATIONID
where s.requestid=29117
)
select RID
    ,Load1_Enable = MAX(case when SGROUPNAME = 'Load1' and TSETTINGNAME = 'Enable' then SSETTING else null end)
from TEMP_TABLE
group by RID

请注意,MAX仅用于汇总-您应该只汇总一条记录。