1
votes

Afficher les lignes vides d'une expression de cas

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
...


8 commentaires

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


3 Réponses :


0
votes

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


1 commentaires

Ne pensez-vous pas que cela entraînera une erreur car PURCHASE_Value est directement utilisé dans SELECT mais pas dans GROUP BY ?



1
votes

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 )
);


1 commentaires

C'est parfait et cela a résolu mon problème exactement. Merci.



2
votes

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;


0 commentaires