SQL Query包括pivot

时间:2015-03-13 03:28:20

标签: sql sql-server

我做了一个包含左外连接和枢轴的查询。 但是我不断收到错误列的错误。

SELECT * FROM 
(select Max(datetimestamp)as datetimestamp, currentSet, tGroup_id from tPhos_Line_Operator 
group by currentSet, tGroup_id)T
LEFT OUTER JOIN 
(SELECT PO.tGroup_id AS G_ID, PO.CurrentSet AS cr,gP.tTest_id AS Header,convert(float,Po.Results) as Results from tPhos_Line_Operator PO
inner join tPhos_Line_Parameter pp
on PO.tPhos_Line_Parameter_id = PP.id
INNER JOIN tGroup_Parameter GP
on pp.tGroup_Parameter_id = gp.id
where PP.tPhosline_id=134)P
on T.tGroup_id = P.G_ID
AND T.CurrentSet = p.cr
PIVOT ( MAX(p.Results) For Header IN ([4],[23],[24])) AS pvt

任何人都知道如何获取DateTimeStamp和数据透视记录? 这意味着在这种情况下我只有4列。

目前我需要选择*来自。 对不起,我还是个问题。 提前谢谢。


样本数据可以在这里:

预期结果样本:

dateTime               | currentset | tGroup_id | G_ID | cr | 4    | 23 | 24 | 
2015-03-11 07:00:24.313      1           69      69      1   8.36    10  14.4 
2015-03-12 00:31:58.257      2           69      69      2   9.12     8  14.4 

2 个答案:

答案 0 :(得分:0)

我正在猜测。您似乎想要“转动”某些结果,以便您可以并排查看这些结果,而不是跨越多行。

虽然PIVOT已添加到许多SQL实现中,但它并不是实现数据透视数据的唯一方法,也不是最好或最简单的方法。这是一个老式的“枢轴”,它使用一组case expressions和'GROUP BY':

SELECT
      PO.tGroup_id AS G_ID
    , PO.CurrentSet AS cr
    , MAX( datetimestamp ) AS datetimestamp
    , MAX( CASE WHEN gP.tTest_id = 4  THEN CONVERT(float, Po.Results) END ) AS Results4
    , MAX( CASE WHEN gP.tTest_id = 23 THEN CONVERT(float, Po.Results) END ) AS Results23
    , MAX( CASE WHEN gP.tTest_id = 24 THEN CONVERT(float, Po.Results) END ) AS Results24
FROM tPhos_Line_Operator PO
      INNER JOIN tPhos_Line_Parameter pp ON PO.tPhos_Line_Parameter_id = PP.id
      INNER JOIN tGroup_Parameter GP ON pp.tGroup_Parameter_id = gp.id
WHERE PP.tPhosline_id = 134
GROUP BY
      PO.currentSet
    , PO.tGroup_id

因为您没有提供样本数据,所以我不知道详细信息,但希望您可以根据您的数据进行折弯。


这是使用PIVOT运算符的替代方法,但这也依赖于使用MAX() OVER()。在这里使用PIVOT运算符的一个复杂因素是,您需要最大日期时间值以及使用内置数据透视运算符复杂的旋转行。我相信下面的MaxDateTime专栏可以克服复杂性:

SELECT
      MaxDateTime , CR, G_ID, [4], [23], [24]
FROM (
      SELECT
            PO.tGroup_id AS G_ID
          , PO.CurrentSet AS cr
          , gP.tTest_id AS Header
          , MAX( PO.datetimestamp ) OVER (PARTITION BY PO.tGroup_id, PO.CurrentSet, gP.tTest_id) AS MaxDateTime
          , CONVERT( float, Po.Results ) AS Results
      FROM tPhos_Line_Operator PO
            INNER JOIN tPhos_Line_Parameter pp ON PO.tPhos_Line_Parameter_id = PP.id
            INNER JOIN tGroup_Parameter GP ON pp.tGroup_Parameter_id = gp.id
      WHERE PP.tPhosline_id = 134
      ) AS sourve_tbl
PIVOT (MAX( Results ) FOR Header IN ([4], [23], [24])
      ) AS pvt_tbl
;

答案 1 :(得分:0)

是的,您现有的查询是错误的。 我试图纠正它。

;With CTE as
(
 select Max(datetimestamp)as datetimestamp, currentSet, tGroup_id 
 from tPhos_Line_Operator 
 group by currentSet, tGroup_id
)

Select * from
 ( SELECT PO.tGroup_id AS G_ID, PO.CurrentSet AS cr,gP.tTest_id AS Header
,convert(float,Po.Results) as Results 
,T.*
from tPhos_Line_Operator PO
inner join tPhos_Line_Parameter pp
on PO.tPhos_Line_Parameter_id = PP.id
INNER JOIN tGroup_Parameter GP
on pp.tGroup_Parameter_id = gp.id
left join CTE T on T.tGroup_id = P.PO.tGroup_id
AND T.CurrentSet = PO.CurrentSet
where PP.tPhosline_id=134)tbl
PIVOT ( MAX(p.Results) For Header IN ([4],[23],[24])) AS pvt