2015-09-30 7 views
5

Я хотел бы получить запрос, который использует большее из двух значений/столбцов, если для другого значения для этого значения истинно.Выберите случай, сравнивающий два столбца

Я пытаюсь получить учетные записи в отчете. К сожалению, БД обычно хранит стоимость наличных денег в столбце HoldingQty, тогда как для каждого другого типа холдинга (акции, облигации, паевые инвестиционные фонды) он хранит его в столбце Qty.

Проблема заключается в том, что иногда стоимость наличных денег сохраняется только в Qty, а иногда и в Qty и HoldingQty. Очевидно, что иногда он сохраняется только в HoldingQty, как упоминалось выше.

В принципе, я хочу, чтобы мой оператор select сказал: «Если безопасность - это деньги, посмотрите на qty и удерживайте qty и дайте мне значение того, что больше. В противном случае, если безопасность не является наличными, просто дайте мне qty», ,

Как бы написать это в T-SQL? Вот мое усилие:

SELECT 
    h.account_name, h.security_name, h.security_type, h.price, 
    (CASE: 
     WHEN security_type = 'cash' 
      THEN (WHEN h.qty > h.holdingqty 
        THEN h.qty 
        ELSE h.holdingqty) 
     ELSE qty) as quantity, 
    h.total_value 
FROM 
    holdings h 
WHERE 
    ........... 
+0

вы почти там с синтаксисом, за исключением. –

+2

Использовать составной регистр case 'case when security_Type = 'cash' и h.qty <= h.holdingqty then h.holdingqty else h.qty end как количество' это в основном говорит, когда тип - это деньги, а holdqty -> или равно qty использовать holdqty, иначе используйте qty. поскольку мы знаем, что это не деньги, мы всегда используем qty, я немного изменил порядок, чтобы упростить оператор case. – xQbert

+2

Будьте осторожны, если эти столбцы имеют значение NULL. – shawnt00

ответ

4

Ваш запрос является правильным, но нужно несколько расположение синтаксиса, попробуйте ниже код

SELECT h.account_name, h.security_name, h.security_type, h.price, 
    CASE WHEN security_type = 'cash' then 
            CASE when h.qty > h.holdingqty then h.qty 
             else h.holdingqty END 
    ELSE qty END AS 'YourColumnName' 
) as quantity, h.total_value 
FROM holdings h 
where ........... 
+0

Спасибо за помощь! –

2

Почти там!

SELECT h.account_name , 
     h.security_name , 
    h.security_type , 
    h.price , 
    CASE WHEN security_type = 'cash' 
     THEN CASE WHEN h.qty > h.holdingqty THEN h.qty 
        ELSE h.holdingqty 
       END 
     ELSE qty 
    END AS quantity , 
    h.total_value 
FROM holdings h 
WHERE ........... 
+0

Спасибо за помощь! –

2

Вы можете достичь этого поведения с вложенной case выражением:

SELECT h.account_name, h.security_name, h.security_type, h.price, 
     CASE security_type 
     WHEN 'cash' THEN CASE WHEN h.qty > h.holdingqty THEN h.qty 
                 ELSE h.holdingqty 
         END 
     ELSE h.qty 
     END 
FROM holdings h 
WHERE ........... 
+0

Спасибо за помощь! –