2009-06-26 2 views

ответ

0

Вы можете использовать GROUP BY для объединения результатов при использовании агрегатной функции, например SUM().

SELECT Cost, SUM(Rate) FROM MyTable GROUP BY Cost 

Это вернет результаты, инвертированные с того, что вы просили, но это не должно быть большой сделкой. Надеюсь.

 
Cost  SUM(Rate) 
---  --- 
Repair 825 
Wear  2066 
Fuel  950 
4
select sum(case when cost = 'Repair' then rate else null end) as Repair 
, sum(case when cost = 'Wear' then rate else null end) as Wear 
, sum(case when cost = 'Fuel' then rate else null end) as Fuel 
from CostRateTable 
+0

Используйте WHEN вместо WHERE в синтаксисе CASE. И прекратите CASE с END или END CASE. –

+0

А, я записывал биту и не проверял синтаксис. Я исправлю это, Привет. – glasnt

+0

Есть ли способ избежать имен столбцов жесткого кодирования? Когда кто-то добавляет строку с именем «Тормоза», запрос должен быть переписан? Подход PIVOT более общий, но это не так просто. – Muxecoid

0

выберите стоимость, сумма (ставка) от TABLENAME группы по стоимости

1

«вращение» вы хотите (что делает строки в столбцы) могут быть получены с помощью оператора SQL сервера PIVOT.

0

Вы можете сделать это с помощью простого перекрестного запроса. В окне «Запросы доступа» есть мастер, который поможет вам создать его. Просто нажмите кнопку «Новый запрос» и выберите мастер запросов к кросс-таблице.

0

Это простой запрос с использованием функции PIVOT. Если у вас есть несколько значений, которые, как известно, преобразуются в столбцы, то вы можете использовать статическую версию:

create table yourtable 
(
    cost varchar(10), 
    rate int 
); 

insert into yourtable values 
('Repair', 12), 
('Repair', 223), 
('Wear', 1000), 
('Wear', 666), 
('Fuel', 500), 
('Repair', 600), 
('Fuel', 450), 
('Wear', 400); 

select * 
from 
(
    select cost, rate 
    from yourtable 
) x 
pivot 
(
    sum(rate) 
    for cost in ([Repair], [Wear], [Fuel]) 
) p; 

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

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(cost) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'SELECT ' + @cols + ' from 
      (
       select cost, rate 
       from yourtable 
      ) x 
      pivot 
      (
       sum(rate) 
       for cost in (' + @cols + ') 
      ) p ' 

execute(@query) 

См. SQL Fiddle with Demo. Оба будут давать одинаковые результаты.

Смежные вопросы