t-sql запрос между таблицей событий и диапазоном дат - PullRequest
3 голосов
/ 18 июня 2010

На основании следующей таблицы

id  Title   Date            Metadata  
------------------------------------
1   A       08/01/2010      M1
1   A       10/05/2010      M2
1   A       03/15/2011      M3
2   B       09/20/2010      M1
2   B       01/15/2011      M2
3   C       12/15/2010      M1

Входными переменными будут дата начала и окончания. Так, например,

@startDate = '07/01/2010' 
@endDate = '06/30/2011'

Как создать вывод ниже?

Title  Jul-10  Aug-10 Sep-10 Oct-10 Nov-10  Dec-10 Jan-11 Feb-11 Mar-11 Apr-11 May-11 Jun-11
-------------------------------------------------------------------------------------------
A      Null    M1     Null    M2     Null   Null   Null    Null   M3     Null   Null   Null
B      Null    M1     Null    Null   Null   Null   M2      Null   Null   Null   Null   Null
C      Null    Null   Null    Null   Null   M1     Null    Null   Null   Null   Null   Null

Ответы [ 2 ]

3 голосов
/ 18 июня 2010

То, что вы ищете, обычно называется кросс-таблицей.Если вы спрашиваете, как построить кросс-таблицу с учетом статического списка столбцов, вы можете сделать что-то вроде этого:предложено Broken Link.Однако и вышеприведенное решение, и функциональность PIVOT основаны на объявлениях столбцов static .Если вам нужен динамический список столбцов (он же динамическая кросс-таблица), то вы находитесь за пределами того, для чего изначально предназначен T-SQL.Это возможно с каким-то неаккуратным динамическим SQL, но оно хрупкое и громоздкое.Вместо этого вы должны построить набор результатов в компоненте среднего уровня или использовать инструмент создания отчетов, который будет создавать результаты кросс-таблицы.

2 голосов
/ 18 июня 2010

Использование Pivot таблицы ..

Простой пример ..

    USE AdventureWorks;
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 

Запрос

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...