Строки в столбцы с использованием Sql Query - PullRequest
2 голосов
/ 26 июня 2009

привет, у меня есть таблица с колонками как

              Cost     Rate

              Repair   12
              Repair   223
              Wear     1000    
              Wear     666
              Fuel     500
              Repair   600
              Fuel     450
              Wear     400

Теперь я хочу эти данные как

             Repair    Wear   Fuel
               825     2066    950

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

Заранее спасибо

Ответы [ 7 ]

4 голосов
/ 26 июня 2009
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
1 голос
/ 26 июня 2009

Я думаю, что вы ищете способ сделать Динамическое вращение или Динамические кросс-таблицы .

Проверьте эти статьи:

1 голос
/ 26 июня 2009

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

0 голосов
/ 21 сентября 2012

Это простой запрос с использованием функции 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 с демоверсией . Оба будут давать одинаковые результаты.

0 голосов
/ 13 июля 2009

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

0 голосов
/ 26 июня 2009

выберите стоимость, сумму (курс) из группы имен таблиц по стоимости

0 голосов
/ 26 июня 2009

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

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

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

Cost     SUM(Rate)
---      ---
Repair   825
Wear     2066
Fuel     950
...