2 votes

Rapport SQL Pivot - Le regroupement ne se fait pas comme souhaité

J'ai une requête qui renvoie un résultat "pivot" SET. Le problème que je rencontre est que les paramètres que je dois faire correspondre à chaque horodatage proviennent d'horodatages légèrement différents --- comme le montre l'image ci-dessous.

J'ai besoin de combiner chacun des 5 paramètres ---gty, tmp, rate, mf, prs--- en 1 ligne sous un "maxtime" arbitraire où ils ignorent les nullités.

Des idées ?

SELECT [time], Tagname, GTY, TMP, FLOW as Rate, MF, PRS
FROM y
PIVOT
(
       max(lastvalue)
       FOR [tag2] IN (GTY, TMP, FLOW, MF, PRS)
) AS P

SQL Piv

1voto

Michael Z. Points 1022

Regroupez-les de manière à conserver la partie temporelle.
Si vous avez besoin de lister toutes les valeurs uniques séparées par des virgules au lieu d'un maximum, j'ai une fonction d'agrégation CLR que vous pouvez utiliser si vous utilisez SQL Server.

SELECT max([time]) AS 'time',
       Tagname,
       max(GTY) AS 'GTY',
       max(TMP) AS 'TMP',
       max(FLOW) AS 'Rate',
       max(MF) AS 'MF',
       max(PRS) AS 'PRS'
FROM y
GROUP BY Tagname

Vous pouvez aussi envelopper votre pivot dans un groupe par

SELECT max([time]) AS 'time',
           Tagname,
           max(GTY) AS 'GTY',
           max(TMP) AS 'TMP',
           max(FLOW) AS 'Rate',
           max(MF) AS 'MF',
           max(PRS) AS 'PRS'
    FROM (SELECT [time], Tagname, GTY, TMP, FLOW as Rate, MF, PRS
          FROM y
          PIVOT
          (
          max(lastvalue)
          FOR [tag2] IN (GTY, TMP, FLOW, MF, PRS)
          ) AS P) y
    GROUP BY Tagname

Ou mieux encore, utilisez CTE

WITH PIV AS 
(SELECT [time], Tagname, GTY, TMP, FLOW as Rate, MF, PRS
FROM y
PIVOT
(
       max(lastvalue)
       FOR [tag2] IN (GTY, TMP, FLOW, MF, PRS)
) AS P)
SELECT max([time]) AS 'time',
           Tagname,
           max(GTY) AS 'GTY',
           max(TMP) AS 'TMP',
           max(FLOW) AS 'Rate',
           max(MF) AS 'MF',
           max(PRS) AS 'PRS'
    FROM PIV
    GROUP BY Tagname

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X