2017-01-21 12 views
2

У меня есть две таблицы: customerTable и orderTable, которые показаны ниже. Мне нужно динамически генерировать столбец order.Как создать столбец на основе идентификатора заказа в sql

CustomerTable

custId CustName 
01  Suresh 
02  Ramesh 

OrderTable

custId OrderId 
01  011 
01  012 

нужен выход, как, как:

custId Order1 Order2 
01  011 012 

Вот если заказ несколько раз для каждого клиента, то столбцы будут динамически динамически.

Если CustID = 01 имеет 011,012,013,014 ...... имеет много заказа, то таблица будет как

custId order1 order2 order3 order4 order5 order6 ...... many oder N columns 
01  011  012 013 014 015 06  ....... 0N.. 
+0

Проверьте функцию, называемую поворотом. Он делает именно это. –

+2

Возможный дубликат [SQL Server dynamic PIVOT query?] (Http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) – GurV

+1

Знаете ли вы общее или максимальное количество заказов, которые клиент может иметь ? Если нет, это не очень хороший подход; как правило, SQL разрабатывается вокруг концепции результатов запроса, имеющих фиксированное количество столбцов с переменным числом строк. – JohnLBevan

ответ

1

ли это динамически, как это:

declare @sql as nvarchar(max) 
declare @cols as nvarchar(max) 

set @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.OrderId) 
      FROM OrderTable c 
      order by 1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 

set @sql = STUFF((SELECT ',' + QUOTENAME(OrderId) + ' as Order' + convert(varchar,row_number() over (order by OrderId)) 
      from (
       select distinct OrderId 
       FROM OrderTable 
      ) t 
      order by 1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 

set @sql = 'SELECT custId, ' + @sql + ' from 
      (
       select * 
       from OrderTable 
      ) x 
      pivot 
      (
       max(OrderId) 
       for OrderId in (' + @cols + ') 
      ) p ' 
exec(@sql) 

Производит:

enter image description here

Следует отметить, что он работает правильно для одного custId, поскольку столбцы выровнены на основе OrderId в результате поворота.

1

Что вы ищете называются поворотным. См. documentation.

Простой пример взят из приведенной выше ссылке:

USE AdventureWorks2008R2; 
GO 
SELECT 
    DaysToManufacture, 
    AVG(StandardCost) AS AverageCost 
FROM Production.Product 
GROUP BY DaysToManufacture; 

Результаты в:

DaysToManufacture | AverageCost 
---------------------------------------- 
0     | 5.0885 
1     | 223.88 
2     | 359.1082 
4     | 949.4105 

Эти строки в исходной таблице сгруппированы, не сделано еще поворота. Посредством поворота вы поворачиваете значения строк в столбце №1 в столбцы, а значения строк в столбце №2 «поворачиваются» и отображаются как одна строка. SQL сделать это следующим образом:

-- Pivot table with one row and five columns 
SELECT 
    'AverageCost' AS Cost_Sorted_By_Production_Days, 
    [0], 
    [1], 
    [2], 
    [3], 
    [4] 
FROM 
(
    SELECT 
     DaysToManufacture, 
     StandardCost 
    FROM 
     Production.Product 
) AS SourceTable 
PIVOT 
(
    AVG(StandardCost) 
    FOR DaysToManufacture IN 
    (
     [0], 
     [1], 
     [2], 
     [3], 
     [4] 
    ) 
) AS PivotTable; 

Это приводит к выходу таких как:

Cost_Sorted_By_Production_Days | 0  | 1  | 2  | 3 | 4 
----------------------------------------------------------------------------- 
AverageCost     | 5.0885 | 223.88 | 359.1082 | NULL | 949.4105