0
votes

Comment trouver la valeur minimale d'une chaîne de données dans SQL

J'essaie de trouver la valeur minimale d'une chaîne en SQL correspondant à la colonne de type dans la table de location. Le client et les tables de location ont une relation de clé primaire / étrangère via la colonne Customer_Id .

La table Lease peut avoir trois lignes possibles pour un CustomerId donné. Ainsi, pour chaque ligne du tableau Client , le tableau Lease peut avoir une ligne de Type = "T" et Type = "P" et Type = "U" .

Dans ce cas, la requête doit renvoyer "P" car c'est le minimum des trois valeurs possibles entre T, U et P. Si la table Lease avait des lignes correspondant uniquement à "T" et "U ", alors la requête doit renvoyer" T ".

J'obtiens une erreur "Syntaxe incorrecte près du mot-clé" de "".

Voici mon instruction SQL:

select  
    Customer_Id, min(lease) as leasetype 
from 
    (values(L1.type), (L2.type), (L3.type)) as T(lease) 
from 
    CUSTOMER c 
join 
    lease L1 on L1.customer_id = c.customer_id and L1.type = 'T' 
join
    lease L2 on L2.customer_id = c.customer_id and L2.type = 'U' 
join
    lease L3 on L3.customer_id = c.customer_id and L3.type = 'P'
where 
    c.order_timestamp >=  '03/01/2018'

Voici mes données de table:

 entrez la description de l'image ici


0 commentaires

4 Réponses :


0
votes

utilisez row_number ()

select customer_id, email_address,Amount from
(select c.customer_id,c.email_address,
  L1.Amount,
row_number()over(partition by c.customer_id order by 
  case when Type='P' then 1 when Type='T' then 2 else 3 end ) rn
from 
    CUSTOMER c 
join 
    lease L1 on L1.customer_id = c.customer_id
) a where a.rn=1


0 commentaires

1
votes

Vous ne pouvez pas avoir deux clauses FROM .

De plus, je pense que vous pouvez beaucoup simplifier la requête ...

select  
    c.customer_id, min(l.type) as leasetype 
from 
    CUSTOMER c 
join 
    lease l
        on l.customer_id = c.customer_id
where
        l.type IN ('P', 'T', 'U')
    AND c.order_timestamp >=  '03/01/2018'
GROUP BY
    c.customer_id

À moins que vous n'ayez également besoin d'autres champs de la table bail ? Ensuite, utilisez l'approche ROW_NUMBER () à partir d'une autre réponse ici.


0 commentaires

0
votes

Je pense que le moyen le plus simple de le faire est de joindre la table client à une table en ligne qui sélectionne votre bail min.

select c.Customer_id, ml.lease
from customer c
inner join (select customer_id, min(lease) from lease) ml 
on c.customer_id = ml.customer_id
where 
    c.order_timestamp >=  '03/01/2018';


0 commentaires

0
votes

La première chose que je vois dans votre requête est la syntaxe de votre "as T (bail)" Le mot-clé "as" est utilisé pour créer un alias et un seul mot est nécessaire (je n'ai jamais vu d'autre écriture mais corrigez-moi si je me trompe). J'essaierais sans parenthèses.

La deuxième chose que je vois, c'est que vous en avez 2 dont il est totalement interdit .. Si vous souhaitez utiliser plusieurs tables, je vous conseille de regarder dans la syntaxe de jointure


0 commentaires