2017-09-18 1 views
0

Je dois calculer le pourcentage de clients au premier trimestre PAR clients au premier trimestre et le statut est «Disponible». Je fais quelque chose comme ça qui ne donne pas de résultats corrects.Mysql Calculer le pourcentage avec la clause group by?

SELECT DISTINCT Customer, COUNT(1)/(select count(1) from table where QUARTER(`Creation_Date`) = 1) 
FROM table 
WHERE Customer is not null and QUARTER(`Creation_Date`)=1 and `Status` = 'Available' 
GROUP BY Customer 

Je veux ajouter un groupe par « Client » dans la première intérieure sélectionnez-à-dire quelque chose comme ci-dessous, mais qui renvoie évidemment plus d'une des lignes. À l'heure actuelle son calcul comme par exemple

select count(1)/select count(1) from table where QUARTER( creation_date ) = 1 and Customer = 'ABC'

4/225 * 100.

besoin pourcentage comme celui-ci en utilisant groupby:

pour chaque client:

X = select count(1) from table where QUARTER(`Creation_Date`) = 1 and Customer = 'X' and Status = 'Available'; 
Y = select count(1) from table where QUARTER(`Creation_Date`) = 1 and Customer = 'X'; 
Z = X/Y*100 

Quelqu'un peut-il s'il vous plaît guider?

+3

Ne pas mélanger 'distinct' et' group by'. Vous allez probablement vous confondre. – GolezTrol

Répondre

1

Je pense que vous ne comprenez pas ce que signifie le pourcentage. Très probablement, vous devez trouver le pourcentage de "disponible" dans l'ensemble. Pour ce faire, vous devrez compter le nombre de «disponibles» et le diviser par le nombre total. Vous devez agréger tous les clients, vous ne devez donc pas sélectionner le client. Au lieu de cela, vous devriez choisir le trimestre. Dans l'ensemble, vous pourriez SQL ressembler à quelque chose comme ceci:

SELECT 
    QUARTER(`Creation_Date`) AS "quarter", 
    SUM(CASE WHEN `Status`='Available' THEN 1 ELSE 0 END)/COUNT(1) AS "pct" 
WHERE 
    Customer is not null and QUARTER(`Creation_Date`)=1 
GROUP BY 
    Customer 

(. Notez que je ne l'ai pas testé, donc quelques modifications mineures peuvent être nécessaires)

+0

Besoin de pourcentage comme ceci: X = sélectionnez le nombre (1) de la table où QUARTER ('Creation_Date') = 1 et Customer = 'X' et Status = 'Available'; Y = sélectionner le compte (1) de la table où QUARTER ('Creation_Date') = 1 et Customer = 'X'; Z = X/Y * 100 –

+1

C'est ce que le SQL de ma réponse fait - il suffit d'ajouter 'et client = X' à la clause where et de multiplier la fraction par 100 –

+0

Cela va vous donner un tas de résultats - et vous Je ne vais pas savoir quel est – Strawberry

1

Vous n'avez pas besoin sous select. Vous pouvez simplement compter les clients disponibles et les diviser par le nombre total de clients. Multipliez par 100 si vous voulez l'exprimer en pourcentage:

Notez que COUNT ne compte que les valeurs qui ne sont pas nulles. Alternativement, vous pouvez utiliser SUM, puisque COUNT(1) est essentiellement le même que SUM(1).

SELECT 
    COUNT(CASE WHEN `Status` = 'Available' THEN 1 END)/COUNT(1) * 100 AS Percentage 
FROM table 
WHERE Customer is not null and QUARTER(`Creation_Date`)=1 
+1

Sûrement SUM Cas – Strawberry

+0

@Strawberry, les deux vont fonctionner, parce que mon 'case' renvoie' NULL' pour indisponible, et 'count' ne compte pas les valeurs nulles. Si vous retournez 1 ou 0 selon la disponibilité, alors vous aurez besoin de 'SUM', car count compte chaque valeur, même' 0'. – GolezTrol

+0

Eh bien, c'est vrai, je suppose. – Strawberry