1
votes

sql sum () sur plusieurs colonnes

J'ai une table avec 7 colonnes:

Color  |  Month  |  Usage  |
----------------------------
Red    |    01   |   10    |
Red    |    02   |    5    |
Red    |    05   |    3    |
Green  |    01   |    6    |
Green  |    05   |    4    |
Black  |    02   |    16   |

Je dois rassembler toutes les couleurs et l'utilisation dans une seule liste:

Color1 (string)
Color2 (string)
Color3 (string)
Use1 (decimal)
Use2 (decimal)
Use3 (decimal)
Date


Col1  |  Col2  |  Col3 |  Use1  |  Use2  |  Use3  |  Date
---------------------------------------------------------------
Red   |  Green |  Red  |  2     |   6    |  8     |  30-01-2018
Red   |  Black |  Black|  5     |   7    |  9     |  25-02-2019
Green |  Red   |  Green|  1     |   3    |  3     |  30-05-2019

Difficulté à trouver un moyen de faire cela en SQL ... Si quelqu'un pouvait m'aider avec ça, je l'apprécierais vraiment.

sql

0 commentaires

3 Réponses :


0
votes

Une méthode est union all . La syntaxe exacte peut varier selon la base de données, mais l'idée est:

select color, month, sum(usage)
from ((select col1 as color, month(date) as month, (use1 + use2 + use3) as usage
      from t
      ) union all
      (select col1 as color, month(date) as month, (use1 + use2 + use3) as usage
       from t
      ) union all
      (select col1 as color, month(date) as month, (use1 + use2 + use3) as usage
       from t
      )
     )
group by color, month;


0 commentaires

0
votes

Considérez séparément chaque col par rapport à utilisation en additionnant l'utilisation à l'intérieur et à l'extérieur de la sous-requête par rapport à la probabilité de répéter des mois pour les couleurs pour le des données entières qui peuvent ne pas être partagées ici.

select color, month, sum(usage) as usage
  from
  (
   select col1 as color, extract(month from Date) as month, 
         sum(use1) as usage from tab group by col1, extract(month from Date) union all
   select col2, extract(month from Date), 
         sum(use2) from tab group by col2, extract(month from Date) union all
   select col3, extract(month from Date), 
         sum(use3) from tab group by col3, extract(month from Date)
  ) q
 group by color, month;

Au fait, nous ne connaissons pas le SGBD . Oracle , MySQL , Postgres prennent en charge la fonction extract () .


1 commentaires

En dehors de la somme de référence circulaire (utilisation) comme utilisation, cela a fonctionné et a résolu mon problème. Merci!



0
votes

J'ai trouvé que c'était une question amusante à essayer de décompresser t-sql. Malheureusement, unpivot ne peut pas diviser la couleur et l'utilisation en deux colonnes, donc je combine la couleur et l'utilisation dans nvarchar à la place. Pas idéal, malheureusement. Mais peut-être que cela donne des idées à quelqu'un d'autre.

select date, col 
from (select mth, col1_use1 = colour1+convert(nvarchar, usage1)
           , col2_use2 = colour2+convert(nvarchar, usage2)
           , col3_use3 = colour3+convert(nvarchar, usage3)
        from colourusagemonth)  m
unpivot 
    (col for colour in (col1_use1, col2_use2, col3_use3) 
    ) as unpvt;


2 commentaires

Ne partez pas du principe que la balise sql concerne SQL Server, car le SQL concerne l’écriture de SQL standard ISO / ANSi SQL. Cette requête ne le confirme pas


Je n'ai pas supposé, il était clair pour moi qu'il n'utilisait pas t-sql à cause de sa syntaxe dans sa question. Mais j'essayais humblement de partager une idée amusante au milieu d'une journée stressante en essayant de me détendre. De toute évidence, je ne pouvais pas résumer les usages en premier lieu, donc ce n'était pas destiné à résoudre son problème de toute façon. Dois-je supprimer mon message?