Можно ли агрегировать по различным пунктам где? - PullRequest
1 голос
/ 22 декабря 2010

Можно ли рассчитать несколько агрегатов, основываясь на отличающихся выражениях где?Например:

Допустим, у меня есть две таблицы, одна для Invoice и одна для InvoiceLineItems.В таблице счетов-фактур есть общее поле для суммы счетов-фактур, и каждая из записей отдельных позиций счета-фактуры в таблице InvoiceLineItems содержит поле, которое указывает, является ли позиция дисконтируемой или нет.Мне нужны три итоговые суммы: одна, где Discountable = 0, и другая, где Discountable = 1, а другая, где Discountable не имеет значения.Таким образом, мой вывод будет:

InvoiceNumber  Total  DiscountableTotal  NonDiscountableTotal
-------------  -----  -----------------  --------------------
1              53.27  27.27              16.00
2              38.94   4.76              34.18
3...

Единственный способ, который я нашел до сих пор, это использовать что-то вроде:

Select i.InvoiceNumber,
       i.Total,
       t0.Total As DiscountableTotal,
       t1.Total As NonDiscountableTotal
From   Invoices i
    Left Join (
        Select   InvoiceNumber,
                 Sum(Amount),
        From     InvoiceLineItems
        Where    Discountable = 0
        Group By InvoiceNumber
    ) As t0 On i.InvoiceNumber = t0.InvoiceNumber
    Left Join (
        Select   InvoiceNumber,
                 Sum(Amount)
        From     InvoiceLineItems
        Where    Discountable = 1
        Group By InvoiceNumber
    ) As t1 On i.InvoiceNumber = t1.InvoiceNumber

Это кажется несколько громоздким, было бы неплохо, если быЯ мог бы сделать что-то вроде:

Select   InvoiceNumber,
         Sum(Amount) Where Discountable = 1 As Discountable
         Sum(Amount) Where Discountable = 0 As NonDiscountable
Group By InvoiceNumber

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

TIA

PS Мне нужно это для запуска на экземпляре SQL Server 2000, но мне также интересно (для дальнейшего использования), если / как я бы достиг этого на SQL Server 2005/2008.

Ответы [ 2 ]

7 голосов
/ 22 декабря 2010

Использование:

  SELECT i.invoicenumber,
         SUM(CASE WHEN i.discountable = 1 THEN i.amount ELSE 0 END) AS discountable,
         SUM(CASE WHEN i.discountable = 0 THEN i.amount ELSE 0 END) AS NonDiscountable
    FROM INVOICES i
GROUP BY i.invoicenumber

Чтобы получить любые другие столбцы в таблице INVOICES (IE: всего), вам нужно выполнить самостоятельное соединение:

SELECT x.invoicenumber,
       x.total,
       y.discountable,
       y.nondiscountable
  FROM INVOICES x
  JOIN (SELECT i.invoicenumber,
               SUM(CASE WHEN i.discountable = 1 THEN i.amount ELSE 0 END) AS discountable,
               SUM(CASE WHEN i.discountable = 0 THEN i.amount ELSE 0 END) AS NonDiscountable
          FROM INVOICES i
      GROUP BY i.invoicenumber) y ON y.invoicenumber = x.invoicenumber
0 голосов
/ 22 декабря 2010

Не уверен насчет фактического синтаксиса, но что-то вроде этого должно работать:

Select   InvoiceNumber,
         Sum(IF(Discountable=1;Amount;0)) As IsDiscountable
         Sum(IF(Discountable=0;Amount;0)) As NonDiscountable
From Invoice
Group By InvoiceNumber
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...