0
votes

Réorganiser les données dans plusieurs colonnes dans une requête SQL

J'extrise les données de l'horaire d'une base de données, les données sont stockées par ligne, avec un champ de type aussi stocké. (c'est-à-dire que la table a des champs pour horodatamp, type de type de données, valeur).

Timestamp   Offset  Multi   Value   Output
-------------------------------------------
2019-07-22  0,7047  0,9805  6,6526  1,1223
2019-07-23  0,7005  0,9850  6,6955  1,1150
2019-07-24  0,6980  0,9855  6,6995  1,1143


1 commentaires

Groupe par horodatage, utilisez des expressions de cas pour Multi etc. dans la liste Select.


3 Réponses :


3
votes

Si le NON des colonnes est fixe, vous pouvez utiliser la méthode pivot de cas -

SELECT Timestamp
      ,MAX(CASE WHEN  Type = 'Offset' THEN Value END) Offset
      ,MAX(CASE WHEN  Type = 'Multi' THEN Value END) Multi
      ,MAX(CASE WHEN  Type = 'Value' THEN Value END) Value
      ,MAX(CASE WHEN  Type = 'Output' THEN Value END) Output
FROM YOUR_TABLE
GROUP BY Timestamp;


0 commentaires

3
votes

Vous pouvez utiliser une agrégation conditionnelle:

select *
  from
  (
    select * 
      from tab
  ) 
  pivot(
         max(value) for Type in ( 'Offset' as "Offset", 'Multi' as "Multi", 
                                  'Value' as "Value", 'Output' as "Output" )
       )
  order by Timestamp;


0 commentaires

0
votes

Si votre colonne TIMESTAMP contient un composant de temps fractionné et que vous souhaitez le troncher à des secondes, ce serait comme suit:

SELECT cast (systimestamp as date) ddate
  ,MAX(DECODE  (Type, 'Offset', Value)) Offset
  ,MAX(DECODE  (Type, 'Multi',  Value)) Multi
  ,MAX(DECODE  (Type, 'Value',  Value)) Value
  ,MAX(DECODE  (Type, 'Output', Value)) Output
FROM YOUR_TABLE
GROUP BY cast (systimestamp as date);


0 commentaires