如何连接三个不同别名的字符串值,并在SQL Server中找到最小值

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (28)

我在SQL Server 2008中工作。我必须在三个可能的字符串值中找到类型字符串的MIN。如果值来自表的单个列,我知道如何执行此操作。就我而言,它来自三个不同的别名。

这是SQL的一部分:

SELECT 
    CustomerId,
    leaseType = (CASE 
                    WHEN MIN(CONCAT(L1.LeaseType, L2.LeaseType, L3.LeaseType)) = 'T' 
                       THEN 'Temporary' 
                    WHEN MIN(CONCAT(L1.LeaseType, L2.LeaseType, L3.LeaseType)) = 'P' 
                       THEN 'Permanant'  
                    WHEN MIN(CONCAT(L1.LeaseType, L2.LeaseType, L3.LeaseType)) = 'U'  
                       THEN 'Unknown' 
                    ELSE '' 
                 END)
FROM
    Customer
INNER JOIN 
    (SELECT
         CustomerId, LeaseType 
     FROM
         Lease 
     WHERE
         LeaseType  = 'T') L1 ON L1.CustomerId  = c.CustomerId  
INNER JOIN 
    (SELECT
         CustomerId, LeaseType  
     FROM
         Lease 
     WHERE
         LeaseType = 'P') L2 ON L2.CustomerId = c.CustomerId
INNER JOIN 
    (SELECT
         CustomerId, LeaseType  
     FROM
         Lease 
     WHERE
         LeaseType  = 'U') L3 ON L3.CustomerId = c.CustomerId
WHERE 
    CustomerId > 10000

但是,该查询不起作用。在其他错误中,它也会抛出

'CONCAT'不是公认的内置函数名称

提问于
用户回答回答于

如果您想要租赁类型的“最小”,您可以使用apply

SELECT . . .
FROM Customer c JOIN
     Lease lt
     ON lt.CustomerId = c.CustomerId AND
        lt.LeaseType  = 'T' JOIN
     Lease lp
     ON lp.CustomerId = c.CustomerId AND
        lp.LeaseType  = 'P' JOIN
     Lease lu
     ON lu.CustomerId = c.CustomerId AND
        lu.LeaseType  = 'U' CROSS APPLY
     (SELECT MIN(v.LeaseType) as LeaseType
      FROM (VALUES (lt.LeaseType), (lp.LeaseType), (lu.LeaseType)
     ) v(LeaseType)

这回答了您提出的问题。我怀疑它有什么用处,因为它总会返回'P'。为什么?所有JOINs都是内连接,所以它们需要匹配。LeaseType是在所使用的JOIN条件,所以匹配是必需的。这仅匹配拥有这三个的客户。

我可以推测你可能想要外连接。但是,与其推测不同,最好还是提出另一个问题,包括样本数据,预期结果以及您真正想要完成的内容的解释。

扫码关注云+社区

领取腾讯云代金券