我试图在SQL中找出与租约表中的类型列相对应的字符串的最小值。客户和租赁表通过Customer_Id
列具有主/外键关系。
对于给定的Lease
,CustomerId
表可以具有三个可能的行。因此,对于Customer
表中的每一行,Lease
表可以包含Type = "T"
和Type = "P"
和Type = "U"
的行。
在这种情况下,查询必须返回“ P”,因为它是T,U和P之间三个可能值的最小值。如果Lease表中的行仅与“ T”和“ U”相对应,则查询应返回“ T”。
我收到“关键字'from'附近的语法不正确”错误。
这是我的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'
以下是我的表格数据:
答案 0 :(得分:1)
您不能有两个FROM
子句。
此外,我认为您可以大大简化查询...
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
除非您还需要lease
表中的其他字段?然后从这里的另一个答案中使用ROW_NUMBER()
方法。
答案 1 :(得分:0)
使用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
答案 2 :(得分:0)
我认为最简单的方法是将客户表连接到一个内联表中,以选择您的最小租约。
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';
答案 3 :(得分:0)
我在查询中看到的第一件事是“ as T(lease)”的语法 “ as”关键字用于创建别名,并且只需要一个单词(我没看过其他任何文字,但是如果我写错了,请更正我)。 我会尝试不带括号。
我看到的第二件事是您完全禁止使用2。如果您要使用许多表,建议您研究联接语法