J'écris un rapport SQL, et l'une des exigences qui m'est demandée est l'inclusion de lignes pour les deux options d'une expression CASE.
Le rapport doit afficher le nombre de "Costing" et "Non-costing "transactions entre tous les clients de la base de données et chacun des 3 clients choisis.
Veuillez consulter l'exemple de mise en page requis.
CUSTOMER_ID | CUSTOMER_NAME | COSTING | CUST_1 | CUST_2 | CUST_3 12 | Red Corp | Non-costing | 1245 | 734 | 84 12 | Red Corp | Costing | 376 | 23 | 2 17 | Blue Corp | Non-costing | 4538 | 36 | 3256 ...
J'ai essayé de mettre le Colonne COSTING dans une instruction de cas. Cependant, je ne peux pas afficher l'exemple de ligne "Blue Corp" "Costing" dans la sortie car il est vide.
select CUSTOMER_ID ,CUSTOMER_NAME ,case when PURCHASE_VALUE = 0 or PURCHASE_VALUE is null then 'Non-costing' when PURCHASE_VALUE != 0 or PURCHASE_VALUE is not null then 'Costing' end AS COSTING ,count(CASE WHEN CUSTOMER_ID = 11 then 1 ELSE NULL END) as "CUST_1" ,count(CASE WHEN CUSTOMER_ID = 22 then 1 ELSE NULL END) as "CUST_2" ,count(CASE WHEN CUSTOMER_ID = 33 then 1 ELSE NULL END) as "CUST_3" from schema.CUSTOMER_TRANSACTIONS group by case when PURCHASE_VALUE = 0 or PURCHASE_VALUE is null then 'Non-costing' when PURCHASE_VALUE != 0 or PURCHASE_VALUE is not null then 'Costing' end ,CUSTOMER_ID ,CUSTOMER_NAME
J'obtiens actuellement la même chose que l'exemple, mais il manque la ligne 0. Veuillez consulter le résultat que j'obtiens actuellement ci-dessous.
CUSTOMER_ID | CUSTOMER_NAME | COSTING | CUST_1 | CUST_2 | CUST_3 12 | Red Corp | Non-costing | 1245 | 734 | 84 12 | Red Corp | Costing | 376 | 23 | 2 17 | Blue Corp | Non-costing | 4538 | 36 | 3256 17 | Blue Corp | Costing | 0 | 0 | 0 ...
3 Réponses :
Vous pourriez essayer ceci. Il vous donnera 0 quand il n'y en a pas.
select CUSTOMER_ID ,CUSTOMER_NAME , CASE WHEN ISNULL(PURCHASE_Value,0) = 0 THEN 'Non-costing' ELSE 'Costing' END ,SUM(CASE WHEN CUSTOMER_ID = 11 then 1 ELSE 0 END) as "CUST_1" ,SUM(CASE WHEN CUSTOMER_ID = 22 then 1 ELSE 0 END) as "CUST_2" ,SUM(CASE WHEN CUSTOMER_ID = 33 then 1 ELSE 0 END) as "CUST_3" from schema.CUSTOMER_TRANSACTIONS group by CUSTOMER_ID ,CUSTOMER_NAME ,PURCHASE_Value
Ne pensez-vous pas que cela entraînera une erreur car PURCHASE_Value
est directement utilisé dans SELECT
mais pas dans GROUP BY
?
D'après votre commentaire,
Alex Poole, vous avez raison, il n'y a pas de données pour "Costing" pour "Blue-corp". Cependant, je veux que la ligne s'affiche avec des 0 plutôt que pas apparaissant du tout.
Je pense que vous devez générer l'enregistrement pour lequel l'un des coûts n'est pas disponible.
J'ai essayé de créer la requête qui générera l'enregistrement si l'enregistrement «Costing» ou «Non-costing» n'est disponible pour aucun client.
Je n'ai pas été en mesure de le tester, veuillez donc le partager en cas de problème.
-- Your original query starts from here WITH DATAA AS (select CUSTOMER_ID ,CUSTOMER_NAME ,case when PURCHASE_VALUE = 0 or PURCHASE_VALUE is null then 'Non-costing' when PURCHASE_VALUE != 0 or PURCHASE_VALUE is not null then 'Costng' end AS COSTING ,count(CASE WHEN CUSTOMER_ID = 11 then 1 ELSE NULL END) as "CUST_1" ,count(CASE WHEN CUSTOMER_ID = 22 then 1 ELSE NULL END) as "CUST_2" ,count(CASE WHEN CUSTOMER_ID = 33 then 1 ELSE NULL END) as "CUST_3" from schema.CUSTOMER_TRANSACTIONS group by case when PURCHASE_VALUE = 0 or PURCHASE_VALUE is null then 'Non-costing' when PURCHASE_VALUE != 0 or PURCHASE_VALUE is not null then 'Costing' end ,CUSTOMER_ID ,CUSTOMER_NAME) -- Your original query ends here -- Solution SELECT CUSTOMER_ID, CUSTOMER_NAME, COSTING, CUST_1, CUST_2, CUST_3 FROM DATAA UNION ALL ( SELECT CUSTOMER_ID, CUSTOMER_NAME, CASE WHEN COUNT(CASE WHEN COSTING = 'Non-costing' THEN 1 END) = 0 THEN 'Non-costing' WHEN COUNT(CASE WHEN COSTING = 'Costing' THEN 1 END) = 0 THEN 'Costing' END AS COSTING, 0, 0, 0 FROM DATAA D1 GROUP BY CUSTOMER_ID, CUSTOMER_NAME HAVING ( COUNT(CASE WHEN COSTING = 'Non-costing' THEN 1 END) = 0 OR COUNT(CASE WHEN COSTING = 'Costng' THEN 1 END) = 0 ) );
C'est parfait et cela a résolu mon problème exactement. Merci.
Utilisez une jointure croisée
pour générer les lignes et une jointure gauche
pour ajouter les colonnes:
select c.CUSTOMER_ID, c.CUSTOMER_NAME, t.costing, sum(CASE WHEN CUSTOMER_ID = 11 then 1 ELSE 0 END) as CUST_1, sum(CASE WHEN CUSTOMER_ID = 22 then 1 ELSE 0 END) as CUST_2, sum(CASE WHEN CUSTOMER_ID = 33 then 1 ELSE 0 END) as CUST_3 from (select distinct ct.customer_id, ct.customer_name from schema.CUSTOMER_TRANSACTIONS ct ) c cross join (select 'Non-costing' as costing from dual union all select 'Costing' from dual ) t left join schema.customer_transactions ct on c.customer_id = ct.customer_id, t.costing = (case when PURCHASE_VALUE = 0 or PURCHASE_VALUE is null then 'Non-costing' else 'Costing' end) group by c.CUSTOMER_ID, c.CUSTOMER_NAME, t.type;
Je n'arrive pas à comprendre votre question? Pourriez-vous fournir le résultat souhaité que vous attendez
Je veux qu'il ressemble au tableau d'exemple en haut.
Et actuellement, quelle sortie obtenez-vous? Pouvez-vous publier ça aussi
Il semble que cela soit dû à un problème de formatage de votre application cliente. Qu'utilisez-vous pour exécuter SQL?
Veuillez également inclure vos données brutes. Il semble qu'il n'y ait pas de données pour l'ID client 17 qui correspondent à cette condition, non? Vous devez donc inclure des données qui n'existent pas? (Je ne suis pas sûr de comprendre ce que vous avez montré de toute façon; comment le
count (case ...)
peut-il être autre chose que zéro, car les identifiants clients ne correspondent pas à ces règles?)Standin.Wolf J'ai mis à jour la question pour inclure un exemple clair de ma sortie actuelle.
Alex Poole, vous avez raison, il n'y a pas de données pour "Costing" pour "Blue-corp". Cependant, je veux que la ligne s'affiche avec des 0 plutôt que de ne pas apparaître du tout.
L'Empaleur, j'utilise "Toad for Oracle" version 12