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