J'ai une requête comme ci-dessous et je souhaite afficher une ligne uniquement si la valeur est 1 en utilisant CASE. Pouvez-vous me dire comment je peux faire ça?

SELECT DISTINCT 
    a.AccountID, 
    a.ForeName, 
    a.Surname, 
    a.Gender, 
    CASE 
        WHEN B.Value = '1145' THEN '1' 
        WHEN B.Value = '1007' THEN '2' ELSE '0' 
    END AS Value, 
    b.Address,
     b.Town
FROM 
    Customer a
LEFT OUTER JOIN 
    AdditionalDetails b
ON 
    b.ID = a.AccountID

Le résultat que j'obtiens:

 AccountID  ForeName  Surname  Gender NoName  Address Town
  00012       Eric      Manse   Male    0      Porto   Porto
  00013       Peter     Mark    Male    0      Porto   Porto
  00014       Tom       Jerry   Male    0      Porto   Porto
  00014       Tom       Jerry   Male    1      Porto   Porto
  00015       Sarah     Parker  Female  0      Porto   Porto
  00015       Sarah     Parker  Female  1      Porto   Porto

S'il y a un 1 dans l'instruction CASE, il ne doit pas afficher le 0 uniquement la ligne avec la valeur 1

1
edcoder 20 nov. 2018 à 15:17

3 réponses

Meilleure réponse

Je suppose que vous voulez MAX() ou MIN():

SELECT c.AccountID, c.ForeName, c.Surname, c.Gender, 
       MAX(CASE WHEN ad.Value = '1145' THEN '1'
                WHEN ad.Value = '1007' THEN '2'
                ELSE '0' 
           END),
      ad.Address, ad.Town
FROM Customer c LEFT OUTER JOIN
     AdditionalDetails ad
     ON c.ID = ad.ID
GROUP BY c.AccountID, c.ForeName, c.Surname, c.Gender, ad.Address, ad.Town;

ÉDITER:

Vous semblez vouloir une priorisation:

SELECT cad.*
FROM (SELECT c.AccountID, c.ForeName, c.Surname, c.Gender, 
             ad.Address, ad.Town,
             ROW_NUMBER() OVER (PARTITION BY c.ACCOUNTID
                                ORDER BY (CASE WHEN ad.Value = '1145' THEN 1
                                               WHEN ad.Value = '1007' THEN 2
                                               ELSE 0'
                                          END) DESC
                               ) as seqnum
      FROM Customer c LEFT OUTER JOIN
           AdditionalDetails ad
           ON c.ID = ad.ID
     ) cad
WHERE seqnum = 1;
1
Gordon Linoff 20 nov. 2018 à 12:54

Tu pourrais essayer comme ci-dessous

 with cte as  (

        SELECT  a.AccountID, a.ForeName, a.Surname, a.Gender,
        b.Address, b.Town,         
        row_number() over(partition by a.AccountID
   order by 
     (CASE WHEN b.Value = '1145' THEN 1 WHEN b.Value = '1007' THEN 2 ELSE 0 
        END) desc) as val
        FROM Customer a
        LEFT OUTER JOIN AdditionalDetails b
        ON b.ID = a.AccountID    
       ) select * from cte where val=1
0
Zaynul Abadin Tuhin 20 nov. 2018 à 13:17

Vous avez modifié votre question. Vous ne recherchez pas de lignes distinctes, mais vous souhaitez classer les lignes et n'afficher que les meilleures correspondances.

En fonction de vos besoins exacts, vous utiliseriez RANK ou ROW_NUMBER avec une clause ORDER BY et PARTITION BY appropriée pour cela.

Par exemple:

select c.*, ad.address, ad.town
from customer c
left join
(
  select
    address,
    town,
    customer_id,
    rank() over (partition by customer_id
                 order by case value when 1145 then 1 when 1007 then 2 else 0 end desc) as rnk
  from additionaldetails
) ad on ad.customer_id = c.id and d.rnk = 1;
1
Thorsten Kettner 20 nov. 2018 à 13:05