SQL - сумма, затем делить на ноль проблем - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь сложить 2 столбца и разделить один на другой, однако при делении на ноль у меня возникают проблемы.

Математика - это, по сути, сумма (a) / сумма (b)

Мой код:

SELECT
      SUM(Inventory.QuantityOutstanding) as Quantity,   

      SUM(inventory.TotalValueOutstanding) as ExtValue,

      (SELECT NULLIF(sum(Inventory.TotalValueOutstanding), 0) /
      NULLIF(SUM(Inventory.QuantityOutstanding), 0)  FROM Inventory)  as AcctValue

FROM Inventory 
GROUP BY inventory.TotalValueOutstanding 

Мой ожидаемый результат:

| Quantity | Extvalue  | AcctValue
|  -10.00  | -92.00    |  0.11
|   13.00  | 0.00      |  0
|   0.00   | 0.00      |  0
|   2.00   | 16.00     |  0.125

Мой фактический вывод:

| Quantity | Extvalue  | AcctValue
|  -10.00  | -92.00    |  76.603066544004906470
|   13.00  | 0.00      |  76.603066544004906470
|   0.00   | 0.00      |  76.603066544004906470
|   2.00   | 16.00     |  76.603066544004906470

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Проблема в вашем подзапросе:

SELECT SUM(i.QuantityOutstanding) as Quantity,   
       SUM(i.TotalValueOutstanding) as ExtValue,
       (NULLIF(SUM(i.TotalValueOutstanding), 0) /
               NULLIF(SUM(i.QuantityOutstanding), 0)
       ) as AcctValue
FROM Inventory i
GROUP BY i.TotalValueOutstanding ;

Я считаю, что двойной NULLIF() немного сбивает с толку.Это может быть яснее, используя CASE:

SELECT SUM(i.QuantityOutstanding) as Quantity,   
       SUM(i.TotalValueOutstanding) as ExtValue,
       (CASE WHEN SUM(i.QuantityOutstanding) = 0 THEN 0
             ELSE SUM(i.TotalValueOutstanding) /                   
                  SUM(i.QuantityOutstanding)
        END) as AcctValue
FROM Inventory i
GROUP BY i.TotalValueOutstanding ;
0 голосов
/ 19 октября 2018

Я не уверен, как они группируются, но я бы предположил, что это какой-то элемент или идентификатор?В качестве аргумента я назвал этот ColumnID, но вы можете заменить его тем, что вы на самом деле используете (например, InventoryItemName?)

Затем вы можете попробовать это, что просто проверяет, равняется ли количество выдающихся единиц 0.Если это так, то ответ - просто 0, иначе рассчитайте формулу как обычно.

SELECT
   Inventory.ColumnID,
   SUM(Inventory.QuantityOutstanding) as Quantity,   

   SUM(inventory.TotalValueOutstanding) as ExtValue,

   IIF(SUM(Inventory.QuantityOutstanding) = 0
        ,0
        ,isnull(sum(Inventory.TotalValueOutstanding), 0) /
           sum(Inventory.QuantityOutstanding)
       ) as AcctValue
FROM 
   Inventory 
GROUP BY
   Inventory.ColumnID
...