Как объединить строковые значения из трех разных псевдонимов и найти минимальное значение в SQL Server - PullRequest
0 голосов
/ 27 марта 2019

Я работаю в SQL Server 2008. Мне нужно найти MIN типа string среди трех возможных строковых значений. Я знаю, как это сделать, если значения взяты из одного столбца таблицы. В моем случае это три разных псевдонима.

Это часть 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' не является распознанным именем встроенной функции

1 Ответ

1 голос
/ 27 марта 2019

Если вы хотите «минимум» типа аренды, вы можете использовать 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, поэтому требуется соответствие. Это соответствует только клиентам, у которых есть все три.

Я могу предположить, что вы могли бы хотеть внешних объединений. Однако вместо того, чтобы спекулировать, вам лучше задать другой вопрос с примерами данных, желаемыми результатами и объяснением того, чего вы действительно хотите достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...