2017-10-23 1 views
0

habe ich eine Pivot-Tabelle die folgende Abfrage in SQL Server 2016.SQL Server 2016 Merge Zeilen in Pivot-Tabellen

mit
WITH PivotData AS 
(
select [T_Spec_Char].[ID], 
    format([T_Sample].[TimeStamp], 'dd/MM/yyyy') as DT, 
    format([T_Sample].[TimeStamp], 'hh:mm:ss') as TM, 
    [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], 
    cast([T_Sample].[Value] as float) as Val 
from [ABC].[dbo].[T_Spec_Char], [ABC].[dbo].[T_Sample], [ABC].[dbo].[T_Spec] 
where [T_Sample].[Spec_Char_ID] = [T_Spec_Char].[ID] and 
    ([T_Spec_Char].[Spec_Char] = 'Zone1Temp' or [T_Spec_Char].[Spec_Char] = 'Zone2Temp' 
    or [T_Spec_Char].[Spec_Char] = 'Zone3Temp') 
    and [T_Sample].[Spec_ID] = [T_Spec].[ID] 
group by [T_Spec_Char].[ID], [T_Sample].[TimeStamp], [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], [T_Sample].[Value] 
) 

SELECT 
    DT, 
    TM, 
    [Line], 
    Zone1Temp, 
    Zone2Temp, 
    Zone3Temp 
FROM PivotData 
PIVOT 
(
    SUM(Val) 
    FOR Spec_Char 
    IN (Zone1Temp, Zone2Temp, Zone3Temp) 
) AS PivotResult 
ORDER BY DT, TM 

Das Ergebnis ist wie folgt:

DT   TM   Line Zone1Temp Zone2Temp Zone3Temp 
07/02/2017 01:21:55 Line2 310  NULL  NULL 
07/02/2017 01:21:55 Line2 NULL  330  NULL 
07/02/2017 01:21:55 Line2 NULL  NULL  345 
07/02/2017 01:51:56 Line2 310  NULL  NULL 
07/02/2017 01:51:57 Line2 NULL  330  NULL 
07/02/2017 01:51:57 Line2 NULL  NULL  345 
07/02/2017 02:21:56 Line2 310  NULL  NULL 
07/02/2017 02:21:56 Line2 NULL  330  NULL 
07/02/2017 02:21:56 Line2 NULL  NULL  345 
07/02/2017 02:51:56 Line2 310  NULL  NULL 
07/02/2017 02:51:56 Line2 NULL  330  NULL 
07/02/2017 02:51:56 Line2 NULL  NULL  345 
07/02/2017 03:21:56 Line2 310  NULL  NULL 
07/02/2017 03:21:56 Line2 NULL  330  NULL 
07/02/2017 03:21:58 Line2 NULL  NULL  345 
07/02/2017 03:51:56 Line2 310  NULL  NULL 
07/02/2017 03:51:57 Line2 NULL  330  NULL 
07/02/2017 03:51:57 Line2 NULL  NULL  345 

Wie würde ich fusionieren die Zeilen mit demselben Datum und derselben Uhrzeit, z. B. die ersten drei Zeilen im Abfrageergebnis, in eine Zeile?

@Noxthron. Ihre Abfrage ergibt folgendes:

DT   TM   Line Temp 
07/02/2017 01:21:55 Line2 310 
07/02/2017 01:21:55 Line2 330 
07/02/2017 01:21:55 Line2 345 
07/02/2017 01:51:56 Line2 310 

I would like to be able to see: 
DT   TM   Line Zone1Temp Zone2Temp Zone3Temp 
07/02/2017 01:21:55 Line2 310  330  345 
+0

Bitte keine Bilder verwenden, um Ihre Daten oder Abfrageergebnisse anzuzeigen. – STLDeveloper

+1

STLDeveloper, Bildwechsel oben, dank Liste. –

+1

.... bitte wechseln sie von der impliziten-Join-Syntax (comma Separated 'FROM' Klausel) explizit die Auflistung schließt sich und ihre Bedingungen. es macht es viel mehr klar, welche Elemente gehören, welche Tabellen (die 'WHERE'-Klausel sollte hauptsächlich für die primäre Filterung der Tabelle in der ursprünglichen' FROM'-Klausel verwendet werden, und das ist es). Wenn Sie nach jeder Spalte in Ihrem 'SELECT' gruppieren, dann haben Sie wirklich' DISTINCT' gemeint, obwohl es normalerweise besser ist um herauszufinden, wo Duplikate kommen von und hören stattdessen auf. –

Antwort

0

Entfernen Sie ID aus dem CTE. PIVOT ist im Wesentlichen „GROUP BY alle Spalten mit Ausnahme des Aggregats und der“ FOR Spalte“. Auf ID Gruppierung hält die Reihen trennen.

WITH PivotData AS 
(
select format([T_Sample].[TimeStamp], 'dd/MM/yyyy') as DT, 
    format([T_Sample].[TimeStamp], 'hh:mm:ss') as TM, 
    [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], 
    cast([T_Sample].[Value] as float) as Val 
from [ABC].[dbo].[T_Spec_Char], [ABC].[dbo].[T_Sample], [ABC].[dbo].[T_Spec] 
where [T_Sample].[Spec_Char_ID] = [T_Spec_Char].[ID] and 
    ([T_Spec_Char].[Spec_Char] = 'Zone1Temp' or [T_Spec_Char].[Spec_Char] = 'Zone2Temp' 
    or [T_Spec_Char].[Spec_Char] = 'Zone3Temp') 
    and [T_Sample].[Spec_ID] = [T_Spec].[ID] 
group by [T_Spec_Char].[ID], [T_Sample].[TimeStamp], [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], [T_Sample].[Value] 
) 

SELECT 
    DT, 
    TM, 
    [Line], 
    Zone1Temp, 
    Zone2Temp, 
    Zone3Temp 
FROM PivotData 
PIVOT 
(
    SUM(Val) 
    FOR Spec_Char 
    IN (Zone1Temp, Zone2Temp, Zone3Temp) 
) AS PivotResult 
ORDER BY DT, TM 
0

nicht getestet, aber Sie sollten die Zeilen, so etwas zu Gruppe verwenden:

SELECT 
    DT, 
    TM, 
    [Line], 
    COALESCE(Zone1Temp, Zone2Temp, Zone3Temp) AS Temp 
FROM PivotData 
PIVOT 
(
    SUM(Val) 
    FOR Spec_Char 
    IN (Zone1Temp, Zone2Temp, Zone3Temp) 
) AS PivotResult 
GROUP BY DT, TM, [Line], COALESCE(Zone1Temp, Zone2Temp, Zone3Temp) 
ORDER BY DT, TM 
0

Der einfachste Weg, ID von Ihrem PivotData CTE

WITH PivotData AS 
(
select -- remove this field [T_Spec_Char].[ID], 
    format([T_Sample].[TimeStamp], 'dd/MM/yyyy') as DT, 
    format([T_Sample].[TimeStamp], 'hh:mm:ss') as TM, 
    [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], 
    cast([T_Sample].[Value] as float) as Val 
from [ABC].[dbo].[T_Spec_Char], [ABC].[dbo].[T_Sample], [ABC].[dbo].[T_Spec] 
where [T_Sample].[Spec_Char_ID] = [T_Spec_Char].[ID] and 
    ([T_Spec_Char].[Spec_Char] = 'Zone1Temp' or [T_Spec_Char].[Spec_Char] = 'Zone2Temp' 
    or [T_Spec_Char].[Spec_Char] = 'Zone3Temp') 
    and [T_Sample].[Spec_ID] = [T_Spec].[ID] 
group by [T_Spec_Char].[ID], [T_Sample].[TimeStamp], [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], [T_Sample].[Value] 
) 

SELECT 
    DT, 
    TM, 
    [Line], 
    Zone1Temp, 
    Zone2Temp, 
    Zone3Temp 
FROM PivotData 
PIVOT 
(
    SUM(Val) 
    FOR Spec_Char 
    IN (Zone1Temp, Zone2Temp, Zone3Temp) 
) AS PivotResult 
ORDER BY DT, TM 
zu entfernen wäre