2015-03-13 2 views
-1

Я выполнил запрос, который включает в себя левое внешнее соединение и ось поворота. Однако я продолжаю получать ошибки, говорящие о некорректном столбце.SQL Query, включая точку поворота

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 
+0

Распределительные колонны определяются путем устранения. Вы используете шарнир и крест, применяя оставшиеся столбцы. –

+0

. Что вы подразумеваете под углом поворота и крестом, применимыми к оставшейся колонке? – AmanMJ

+0

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

ответ

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 
; 
+0

Спасибо, я нашел способы предоставить свои данные, но я не могу прикрепить изображение здесь. Причина, по которой я использовал опорную точку, состоит в том, что tTest_id на самом деле является строкой, поэтому мне бы хотелось, чтобы она стала столбцом. Однако Test_id также будет динамичным. Так что это немного сложно для меня. – AmanMJ

+0

вы пробовали запрос вообще, он будет поворачивать прежние строки в столбцы, вот и все. –

+0

Да, я попробовал this.i получил ошибку, поэтому сначала мне нужно ее проверить. – AmanMJ

0

Да существующий запрос неправильно. I hv попытался исправить ситуацию.

;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