2008-12-07 7 views
8

У меня есть простая проблема при запросе базы данных SQL Server 2005. У меня есть таблицы под названием Customer and Products (1-> M). У одного клиента есть всего 2 продукта. Вместо вывода в качествеКак преобразовать строки в столбцы

CUSTOMERNAME, ProductName ...

Мне нравится выводить как

CUSTOMERNAME, Product1Name, Product2Name ...

Может кто-нибудь мне помочь?

Спасибо!

ответ

10

Как уже говорили другие, вы можете использовать PIVOT и UNPIVOT операторов. К сожалению, одна из проблем как с PIVOT, так и с UNPIVOT заключается в том, что вам нужно знать значения, которые вы будете устанавливать заранее, или использовать динамический SQL.

Похоже, в вашем случае вам понадобится использовать динамический SQL. Чтобы получить эту работу, вам нужно будет вывести список продуктов, используемых в вашем запросе. Если вы используете базу данных AdventureWorks, ваш код будет выглядеть следующим образом:

USE AdventureWorks; 
GO 

DECLARE @columns NVARCHAR(MAX); 

SELECT x.ProductName 
INTO #products 
FROM (SELECT p.[Name] AS ProductName 
    FROM Purchasing.Vendor AS v 
    INNER JOIN Purchasing.PurchaseOrderHeader AS poh ON v.VendorID = poh.VendorID 
    INNER JOIN Purchasing.PurchaseOrderDetail AS pod ON poh.PurchaseOrderID = pod.PurchaseOrderID 
    INNER JOIN Production.Product AS p ON pod.ProductID = p.ProductID 
    GROUP BY p.[Name]) AS x; 

SELECT @columns = STUFF(
    (SELECT ', ' + QUOTENAME(ProductName, '[') AS [text()] 
     FROM #products FOR XML PATH ('') 
    ), 1, 1, ''); 

SELECT @columns; 

Теперь, когда у вас есть столбцы, вы можете вытащить все, что вам нужно повернуть на с динамическим запросом:

DECLARE @sql NVARCHAR(MAX); 

SET @sql = 'SELECT CustomerName, ' + @columns + ' 
FROM (
    // your query goes here 
) AS source 
PIVOT (SUM(order_count) FOR product_name IN (' + @columns + ') AS p'; 

EXEC sp_executesql @sql 

Конечно, если вам нужно убедиться, что вы получаете приличные значения, вам может понадобиться дублировать используемую вами логику для создания @columns и создать переменную @coalesceColumns, которая будет содержать код COALESCE (col_name, 0), если вам нужно такого рода вещи в вашем запросе.

1

в sql2005 есть функции под названием «PIVOT» и «UNPIVOT», которые могут использоваться для преобразования между строками и столбцами.

Надеюсь, что это могло вам помочь.

1

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

Select 
Customer, 
Sum(Case When Product = 'Foo' Then 1 Else 0 End) Foo_Count, 
Sum(Case When Product = 'Bar' Then 1 Else 0 End) Bar_Count 
From Customers_Products 
Group By Customer 
Смежные вопросы