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:
4 Réponses :
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
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.
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';
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