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 ?

0
sandesh b n 21 avril 2017 à 18:37

3 réponses

Meilleure réponse

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é avec group 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.
1
Gordon Linoff 21 avril 2017 à 15:51

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 
0
TriV 21 avril 2017 à 15:57

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
0
cloudsafe 21 avril 2017 à 15:52