SQL-запросы - создание сетки из трех столбцов - PullRequest
1 голос
/ 25 августа 2009

Моя таблица SQL имеет три столбца:

TaskID   VarID   Hours
001      001     10
001      002     40
001      003     100
002      001     50
002      002     80
002      003     90

Я хочу произвести вывод, подобный следующему

TaskID     VarID ->   001      002      003
001                   10       40       100
002                   50       80       90

Я думаю, что есть какой-то запрос или функция, которая может помочь мне сделать это. Есть идеи?

Ответы [ 2 ]

1 голос
/ 26 августа 2009

Да, вы можете сделать это довольно легко в SQL Server 2005 и выше - волшебное слово PIVOT.

Вот запрос, который вам нужен:

SELECT 
      TaskID,
      [001], [002], [003]
FROM 
    YourTable
PIVOT 
    ( 
        SUM(HOURS)
        FOR VarID IN ([001], [002], [003])
    ) 
    AS YourPivot
ORDER BY 
      YourPivot.TaskID

Поначалу идея таблицы PIVOT немного сложна - возможно, вам помогут следующие дополнительные источники информации:

Объяснение из MSDN может пролить некоторый свет:

Вы можете использовать PIVOT и UNPIVOT реляционные операторы, чтобы изменить табличное выражение в другое Таблица. PIVOT вращает табличное значение выражение путем превращения уникального значения из одного столбца в выражение в несколько столбцов в вывод и выполняет агрегации где они требуются на любом оставшиеся значения столбца, которые хотел в окончательном выводе. UNPIVOT выполняет противоположную операцию PIVOT вращающимися колоннами табличное выражение в столбце значения.

Таким образом, вы берете переменную VarID и превращаете ее отдельные значения (001, 002, 003) и агрегирование по ним (SUM (Hours)) в столбцы новой сводной таблицы.

Марк

0 голосов
/ 25 августа 2009

Вам нужен перекрестный запрос. К сожалению, это нелегко сделать в SQL Server. В MS Access это очень просто (есть мастер, который поможет.)

Вам нужно будет использовать функцию PIVOT. Я использую хранимый процесс, как это:

   CREATE PROCEDURE [dbo].[usp_pivot_sa_byHomeCare] AS
   DECLARE @columns VARCHAR(1000)

   SELECT @columns = COALESCE(@columns + ',[' + cast(HomeCareRating as varchar) + ']',
   '[' + cast(HomeCareRating as varchar)+ ']')
   FROM vw_sa_byHomeCare
   GROUP BY HomeCareRating
   --print @columns

   DECLARE @query VARCHAR(8000)

   SET @query = '
   SELECT *
   FROM vw_sa_byHomeCare
   PIVOT
   (
   sum(count_pmin)
   FOR [HomeCareRating]
   IN (' + @columns + ')
   )
   AS p'

   --print @query

   EXECUTE(@query)

где мое представление (vw_sa_byHomeCare) - это представление, которое я хочу развернуть, HomeCareRating - это столбец для поворота, а сумма (count_pmin) - мое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...