Вставить строку в результат запроса (сумма) - PullRequest
5 голосов
/ 19 апреля 2011

У меня есть отчет, который показывает товары, которые заказали клиенты, вместе с их ценами:

CompanyA    Product 7    14.99  
CompanyA    Product 3    45.95
CompanyA    Product 4    12.00
CompanyB    Product 3    45.95
CompanyC    Product 7    14.99
CompanyC    Product 3    45.95

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

CompanyA    Product 7    14.99  
CompanyA    Product 3    45.95
CompanyA    Product 4    12.00
               Total:    72.94
CompanyB    Product 3    45.95
               Total:    45.95
CompanyC    Product 7    14.99
CompanyC    Product 3    45.95
               Total:    60.94

Вот некоторый код, который показывает основную структуру запроса, который у меня есть:

SELECT company
   , product
   , price
FROM companyMaster
ORDER BY company,
   , product,
   , price;

Кто-нибудь знает, как это сделать? Я пишу это в Transact-SQL (Microsoft SQL Server).

Ответы [ 3 ]

4 голосов
/ 19 апреля 2011
SELECT  company,
        product,
        SUM(price)
FROM    companyMaster
GROUP BY
        company, ROLLUP(product)
3 голосов
/ 20 апреля 2011

Спасибо всем за отзыв / помощь, по крайней мере, это заставило меня задуматься о разных подходах. Я придумал что-то, что не зависит от того, какую версию SQL Server я использую (наш поставщик часто меняет версии, поэтому я должен быть максимально совместимым).

Это может считаться взломом (хорошо, это взлом), но это работает, и оно выполняет свою работу:

SELECT company
   , product
   , price
FROM companyMaster
ORDER BY company,
   , product,
   , price

UNION

SELECT company + 'Total'
   , ''
   , SUM(price)
FROM companyMaster
GROUP BY company

ORDER BY company;

Это решение в основном использует СОЮЗ двух операторов выбора. Первый точно так же, как оригинал, второй производит строку суммы, мне нужно. Чтобы правильно найти строку суммы, я выполнил конкатенацию строки с названием компании (добавив слово «Всего»), чтобы при сортировке в алфавитном порядке по названию компании строка «Итого» отображалась внизу каждого раздела компании ,

Вот как выглядит итоговый отчет (не совсем то, что я хотел, но функционально эквивалентный, просто не очень красивый на вид:

CompanyA    Product 7    14.99  
CompanyA    Product 3    45.95
CompanyA    Product 4    12.00
CompanyA Total           72.94
CompanyB    Product 3    45.95
CompanyB Total           45.95
CompanyC    Product 7    14.99
CompanyC    Product 3    45.95
CompanyC Total           60.94
2 голосов
/ 20 апреля 2011

Поскольку вы работаете с SQL Server 2005, вам нужно использовать накопительный пакет , как этот.

-- cte for test data
;with companyMaster(company, product, price) as
(select 'CompanyA',    'Product 7',    14.99 union all  
 select 'CompanyA',    'Product 3',    45.95 union all
 select 'CompanyA',    'Product 4',    12.00 union all
 select 'CompanyB',    'Product 3',    45.95 union all
 select 'CompanyC',    'Product 7',    14.99 union all
 select 'CompanyC',    'Product 3',    45.95
)

select
  company,
  case when grouping(product) = 0
    then product
    else 'Total:'
  end,
  sum(price)
from companyMaster
group by company, product with rollup
having grouping(company) = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...