J'ai écrit la requête suivante:
select distinct
t0.DocDate
,t4.U_SES_VS as 'Value stream'
,case when (t1.ItemCode) = 'WC-QA' then count(t1.itemcode) else 0 end as 'WC-QA'
,case when (t1.ItemCode) = 'WC-REC_INSPECTION' then count(t1.itemcode) else 0 end as 'Inspection'
from ige1 t1
INNER JOIN OIGE T0 ON T1.DOCENTRY = T0.DOCENTRY
and few other tables T2,T3,T4,T5 all on Inner Join
Where t1.qty > = t3.qty
group by t0.docdate,t4.u_ses_vs,t1.itemcode
J'ai la sortie suivante:
**DocDate** | **Value Stream** | **WC-QA** | **Inspection** |
2017-04-14 | Engineering | 0 | 0 |
2017-04-14 | Production | 14 | 0 |
2017-04-14 | Quality | 5 | 0 |
2017-04-14 | Quality | 0 | 1 |
Je souhaite fusionner la ligne de qualité pour qu'elle soit au format suivant:
2017-04-14 | Quality | 5 | 1 |
Comment puis-je faire cela ?
3 réponses
Je pense que c'est ce que vous voulez:
select t0.DocDate
sum(case when t1.ItemCode = 'WC-QA' then 1 else 0 end) as WC_QA,
sum(case when t1.ItemCode = 'WC-REC_INSPECTION' then 1 else 0 end) as Inspection
from ige1 t1 INNER JOIN
OIGE T0
ON T1.DOCENTRY = T0.DOCENTRY
and few other tables T2,T3,T4,T5 all on Inner Join
Where t1.qty > = t3.qty
group by t0.docdate;
J'appelle cela «agrégation conditionnelle»; c'est à ce moment que case
entre dans la fonction d'agrégation.
Remarques:
select distinct
n'est presque jamais approprié avecgroup by
. Cela indique généralement un problème.group by
sans fonctions d'agrégation indique généralement un problème.- Utilisez
group by
pour définir chaque ligne unique que vous souhaitez dans l'ensemble de résultats. Dans ce cas, vous semblez vouloir une ligne par date. - N'utilisez que des guillemets simples pour les constantes de chaîne et de date; ne les utilisez pas pour les alias de colonne.
Vous pouvez remplacer Count
par SUM
et supprimer t1.itemcode
dans group by
. Supprimez distinct
car vous avez group by
select
t0.DocDate
,t4.U_SES_VS as 'Value stream'
,SUM(case when (t1.ItemCode) = 'WC-QA' then 1 else 0 end) as 'WC-QA'
,SUM(case when (t1.ItemCode) = 'WC-REC_INSPECTION' then 1 else 0 end) as 'Inspection'
from ige1 t1
INNER JOIN OIGE T0 ON T1.DOCENTRY = T0.DOCENTRY
and few other tables T2,T3,T4,T5 all on Inner Join
Where t1.qty > = t3.qty
group by t0.docdate,t4.u_ses_vs
Prenez les valeurs du regroupement et utilisez SUM:
select
t0.DocDate
,t4.U_SES_VS as 'Value stream'
,SUM(case when (t1.ItemCode) = 'WC-QA' then count(t1.itemcode) else 0 end) as 'WC-QA'
,sum(case when (t1.ItemCode) = 'WC-REC_INSPECTION' then count(t1.itemcode) else 0 end) as 'Inspection'
from ige1 t1
INNER JOIN OIGE T0 ON T1.DOCENTRY = T0.DOCENTRY
and few other tables T2,T3,T4,T5 all on Inner Join
Where t1.qty > = t3.qty
group by t0.docdate,t4.u_ses_vs
De nouvelles questions
sql
Le langage de requête structuré (SQL) est un langage permettant d'interroger des bases de données. Les questions doivent inclure des exemples de code, une structure de table, des exemples de données et une balise pour l'implémentation du SGBD (par exemple MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, etc.) utilisés. Si votre question concerne uniquement un SGBD spécifique (utilise des extensions / fonctionnalités spécifiques), utilisez plutôt la balise de ce SGBD. Les réponses aux questions marquées avec SQL doivent utiliser le standard SQL ISO / IEC.