我在SQL Server 2008中工作。我必须在三个可能的字符串值中找到字符串类型的最小值。如果值来自表的单个列,我知道如何执行此操作。在我的例子中,它来自三个不同的别名。
这是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‘不是可识别的内置函数名
发布于 2019-03-27 08:42:42
如果您想要租赁类型的“最小值”,您可以使用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‘。为什么?所有的JOIN
都是内连接,所以它们需要一个匹配。LeaseType
在JOIN
条件中使用,因此需要匹配。这只匹配拥有所有这三个参数的客户。
我可以推测您可能想要外部连接。不过,与其猜测,不如用样本数据、期望的结果和对您真正想要实现的目标的解释来问另一个问题。
https://stackoverflow.com/questions/55368150
复制相似问题