2
votes

Récupérer le nombre total de commandes passées et le nombre de commandes pour lesquelles le paiement a été effectué

Récupérez le nombre total de commandes passées et le nombre de commandes pour lesquelles le paiement a été effectué (livré).

COMMANDE DE TABLE

TOTALORDERDSCOUNT     PAIDORDERSCOUNT
      8                     5

Impossible d'obtenir le total number of orderid ie 8

select count(orderid) as "TOTALORDERSCOUNT",count(Status) as "PAIDORDERSCOUNT" 
  from orders 
 where status ='Delivered'

La sortie attendue est

------------------------------------------------------
ORDERID QUOTATIONID     STATUS  
----------------------------------------------------
Q1001   Q1002           Delivered
O1002   Q1006           Ordered                         
O1003   Q1003           Delivered               
O1004   Q1006           Delivered               
O1005   Q1002           Delivered               
O1006   Q1008           Delivered               
O1007   Q1009           Ordered                             
O1008   Q1013           Ordered     

sql

1 commentaires

En effet, votre clause WHERE filtre les lignes avec le statut Commandé


5 Réponses :


6
votes

Je pense que vous voulez une agrégation conditionnelle:

select count(*) as TOTALORDERSCOUNT,
       sum(case when status = 'Delivered' then 1 else 0 end) as PAIDORDERSCOUNT
from orders;


1 commentaires

merci cela a fonctionné. Avez-vous une solution alternative?



2
votes

Essayez ceci -

SELECT COUNT(ORDERID) TOTALORDERDSCOUNT, 
COUNT(CASE WHEN STATUS = 'Delivered' THEN 1 ELSE NULL END ) PAIDORDERSCOUNT
FROM ORDER

Vous pouvez également utiliser COUNT à la place de SUM comme ci-dessous-

SELECT COUNT(ORDERID) TOTALORDERDSCOUNT, 
SUM(CASE WHEN STATUS = 'Delivered' THEN 1 ELSE 0 END ) PAIDORDERSCOUNT
FROM ORDER


0 commentaires

0
votes

vous pouvez utiliser une jointure croisée entre les deux comptages

select count(orderid) as TOTALORDERSCOUNT, t.PAIDORDERSCOUNT 
from  orders 
cross  join (
  select  count(Status) PAIDORDERSCOUNT 
  from orders where Status ='Delivered'
)  t 


0 commentaires

0
votes
    SELECT DISTINCT COUNT(ORDERID) AS [TOTALORDERSCOUNT],
                    COUNT(CASE WHEN STATUS = 'ORDERED' THEN ORDERID ELSE NULL END) AS [PAIDORDERCOUNT]
    FROM ORDERS
TotalOrdersCount will count all distinct values in orderID while the case statement on PaidOrderCount will filter out any that do not have the desired Status.

1 commentaires

Bien que ce code puisse résoudre la question, y compris une explication de comment et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de votre message, et entraînerait probablement plus de votes à la hausse. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement à la personne qui la pose maintenant. Veuillez modifier votre réponse pour ajouter une explication et donner une indication des limitations et hypothèses applicables.



0
votes

Ce que j'ai utilisé dans le passé pour résumer les totaux, c'est

SELECT
count(*) 'Total Orders',
sum( iif( orders.STATUS = 'Delivered', 1, 0 ) ) 'Total Paid Orders'
FROM orders

Personnellement, je n'aime pas utiliser CASE WHEN si je n'ai pas à le faire. Cette logique peut sembler un peu trop pour une simple sommation des totaux, mais elle permet d'ajouter plus de conditions assez facilement et implique aussi simplement moins de frappe, du moins pour ce que j'utilise régulièrement.

Utilisation de l'instruction iif (pour configurer le conditionnel où vous recherchez toutes les lignes de la colonne STATUS avec la valeur `` Delivered '', avec cette configuration, si le statut est `` Delivered '', il marque valeur de 1 pour cette commande, et si le statut est "Commandé" ou toute autre valeur, y compris des valeurs nulles ou si vous avez besoin d'un critère tel que "En attente", cela donnera toujours un décompte précis.

Ensuite, l'imbrication de ceci dans la fonction "sum" totalise tous les 1 indiqués à partir de vos valeurs correspondantes. J'utilise cette méthode régulièrement pour interroger les rapports lorsqu'il est nécessaire de réduire de nombreuses conditions à une valeur additionnée. Cela ouvre également de nombreuses options au cas où vous auriez besoin de joindre des tables dans votre instruction FROM.

Aussi juste par préférence personnelle et en fonction de l'environnement SQL dans lequel vous l'utilisez, j'ai tendance à n'utiliser que les instructions AS pour renommer lorsque cela est absolument nécessaire et à la place, simplement désigner le nom de la colonne avec une seule chaîne entre guillemets. Fait la même chose, mais c'est juste une préférence personnelle.

Comme indiqué précédemment, cela peut sembler faire trop, mais pour moi, un bon SQL permet de modifier facilement les conditions sans avoir à réécrire une requête entière .

EDIT ** J'ai oublié de mentionner que l'utilisation de count (*) ne fonctionne que si les orderid sont tous des valeurs uniques. De manière générale, pour une table de commandes, orderid est une valeur unique attendue, mais je voulais simplement l'ajouter en note d'accompagnement.


0 commentaires