TSQL-эквивалент запроса MS Access Crosstab - PullRequest
4 голосов
/ 29 апреля 2009

Что эквивалентно кросс-таблице MS-Access в TSQL? И есть ли лучший способ?

У меня есть данные, организованные так:

Fish
ID   Name
---- ---------
1    Jack
2    Trout
3    Bass
4    Cat

FishProperty
ID   FishID Property Value
---- ------ -------- -----
1    1      Length   10
2    1      Girth    6
3    1      Weight   4
4    2      Length   6
5    2      Weight   2
6    3      Girth    12

У меня есть несколько пользователей, которым необходимо составлять отчеты по данным, и (очевидно) им будет легче, если они увидят это так:

Fish
ID   Name      Length Girth Weight
---- --------- ------ ----- ------
1    Jack      10     6     4
2    Trout     6            2
3    Bass             12

Мой план состоял в том, чтобы создать представление в виде кросс-таблицы, о котором они могли бы сообщать напрямую.

Ответы [ 4 ]

9 голосов
/ 29 апреля 2009

Вы ищете PIVOT ?

Редактировать : Возможно, вам придется перейти на вторую страницу, прежде чем вы увидите использование синтаксиса PIVOT.

Редактировать 2 : Другой пример .

Пример :

SELECT SalesPerson, [Oranges] AS Oranges, [Pickles] AS Pickles
FROM
(SELECT SalesPerson, Product, SalesAmount
FROM ProductSales ) ps
PIVOT
(
SUM (SalesAmount)
FOR Product IN
( [Oranges], [Pickles])
) AS pvt

Редактировать 3 CodeSlave, посмотрите на эту запись в блоге для получения дополнительной информации о динамических сводных запросах.

0 голосов
/ 29 апреля 2009

Вы также можете использовать оператор CASE , но ваш инструмент отчетности должен иметь возможность сделать это для вас (динамически!) С помощью шаблона matrix / pivot / crosstab.

0 голосов
/ 29 апреля 2009

Это дубликат этого вопроса: Нужна помощь с динамическим поворотом в SQL2005 и да, это возможно сделать с динамическим SQL, с некоторыми приемами, вы даже сможете сделать выбор из результатов, возвращенных или создайте для него представление, но если в вашей таблице более 1000 записей, я бы не рекомендовал этот подход, поскольку в лучшем случае производительность была бы низкой.

0 голосов
/ 29 апреля 2009

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

create view dbo.myview
as
select 
    fish.ID
,   fish.Name
,   len.Value as Length
,   gir.Value as Girth
,   wei.Value as Weight
from fish
left join fishproperty len 
    on len.fishid = fish.id 
    and len.property = 'Length'
left join fishproperty gir 
    on gir.fishid = fish.id 
    and gir.property = 'Girth'
left join fishproperty wei 
    on wei.fishid = fish.id 
    and wei.property = 'Weight'

Если вы не знаете столбцы заблаговременно, единственное решение, о котором я могу подумать, - это динамически сгенерировать запрос и использовать «exec sp_executesql» для его выполнения. Например:

declare @query nvarchar(4000)
set @query = 'select ... from fish'
-- For each column
set @query = @query + ' left join fishproperty ' +
    propname + ' on ' + propname + '.fishid = fish.id ' +
    'and ' + propname + '.property = ''' + propname + ''' '
exec sp_executesql @query

Предупреждение: динамические запросы могут быть головной болью при обслуживании.

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