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.
3 Réponses :
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;
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 () .
En dehors de la somme de référence circulaire (utilisation) comme utilisation, cela a fonctionné et a résolu mon problème. Merci!
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;
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?