0
votes

SQL SUBQUERY AVEC FONCTION AGRÉGATE - Demander une alternative

Ma table (Table1) XXX PRE>

J'ai fait une sorte de pivot et c'est bien: http://sqlfiddle.com/#!18/45b9d/1/0 p> xxx pré>

maintenant je dois calculer La différence entre les mesures, pour obtenir quelque chose comme ceci: p> xxx pré>

mais si je n'utilise pas d'agrégat, le résultat m'apporte des cellules null - http://sqlfiddle.com/#!18/45b9d/5/0 P>

SELECT (SELECT DISTINCT a.Date)
, SUM(CASE WHEN a.Houses = 'House_A' THEN a.kW_measure END) as 'House_A'
, a.Kw_Measure - (SELECT MIN(b.kW_Measure) FROM Table1 b WHERE b.Houses = 'House_A'
     AND b.Date < a.Date)

FROM Table1 a

GROUP BY Date, kW_Measure
ORDER BY Date ASC


1 commentaires

Les tables dérivées ou les CTES sont un moyen d'obtenir des agrégats d'agrégats également.


3 Réponses :


0
votes

1 commentaires

Fonctionne parfaitement, mais depuis que je devais utiliser à la fois house_n et quotidien, le code a plus grand pour moi.



1
votes

Vous pouvez utiliser les fonctions de fenêtre. À partir de votre requête d'agrégation conditionnelle existante, cela calcule la différence de consommation entre la date actuelle et la date précédente pour chaque maison: xxx

la sous-requête n'est pas techniquement nécessaire, mais elle évite de répéter le conditionnel somme () s deux fois.


1 commentaires

C'est la solution la plus propre, avec la sous-requête



1
votes

Si vous souhaitez que la maison soit une colonne séparée comme suggère les résultats, vous pouvez simplement utiliser:

select house, date, kw_measure,
       (kw_measure -
        lag(kw_measure, 1, kw_measure) over (partition by house order by date) 
       ) as diff
from table1;


1 commentaires

Aussi une bonne solution si je n'ai pas besoin d'utiliser chaque maison comme une colonne