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
5 Réponses :
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;
merci cela a fonctionné. Avez-vous une solution alternative?
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
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
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.
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.
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.
En effet, votre clause
WHEREfiltre les lignes avec le statut Commandé