如何在SQL

时间:2019-03-27 17:06:30

标签: sql sql-server

我试图在SQL中找出与租约表中的类型列相对应的字符串的最小值。客户和租赁表通过Customer_Id列具有主/外键关系。

对于给定的LeaseCustomerId表可以具有三个可能的行。因此,对于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'

以下是我的表格数据:

enter image description here

4 个答案:

答案 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。如果您要使用许多表,建议您研究联接语法