Okay, unten zu schreiben ist ein Beispiel für eine Abfrage, die ich geschrieben habe, die das tut Hing ähnlich wie du willst. Es nimmt eine Reihe von Daten und schwenkt basierend auf dem Anfangsjahr dynamisch. Ich habe dir nur den ersten Drehpunkt (für Preis) gegeben. Wenn Sie in der zweiten Spalte und darüber hinaus pivotieren möchten, müssen Sie eine zweite dynamische Auswahlzeichenfolge erstellen und dann im neuen dynamischeren SQL-Element weiter unten auf dem neuen Drehpunkt arbeiten.
declare @startYear int = 2010;
declare @startDate datetime = '1/1/2010 00:00:00.000';
declare @endYear int = year(getutcdate());
declare @endDate datetime = convert(datetime, '12/31/' + convert(nvarchar, @endYear) + ' 23:59:59.997');
-- our variables for string concatenation
declare @yearString nvarchar(max) = ''
, @piv1YearSelectionString nvarchar(max) = ''
, @query nvarchar(max) = ''
;
-- check for the existence of our temp table and dropping it
if exists (
select * from tempdb.dbo.sysobjects o
where o.xtype in ('U')
and o.id = object_id(N'tempdb..#rawData')
)
begin
drop table #rawData;
end
-- create our temp table
create table #rawData
(
EmployeeId nvarchar(50)
, InvoiceYear int
, Price money
, Cm nvarchar(50)
, St1 int
, St2 int
);
-- concatenate our strings with our year column names
while (@startYear <= @endYear)
begin
-- creates a string of values like [2010, 2011, ...]
set @yearString = @yearString + '[' + convert(nvarchar, @startYear) + ']';
-- creates a string of values like ['COALESCE(MAX[a].[2011], 0) as [Price2011], ...
set @piv1YearSelectionString = @piv1YearSelectionString + 'COALESCE(MAX([a].[' + convert(nvarchar, @startYear) + ']), 0) AS [Price' + convert(nvarchar, @startYear) + ']';
set @startYear = @startYear + 1;
-- adds commas to the strings
if @startYear <= @endYear
begin
set @yearString = @yearString + ', ';
set @piv1YearSelectionString = @piv1YearSelectionString + ', ';
end
end
;
-- build the query here
set @query = '
declare @sDate datetime = ''' + convert(varchar, @startDate) + ''';
declare @eDate datetime = dateadd(s, -1, dateadd(yyyy, 1, @sDate));
declare @stopDate datetime = ''' + convert(varchar, @endDate) + ''';
while @sDate < @stopDate
begin
-- uncomment the line below to see the dates
--select @sDate, @eDate;
-- collect your input table
insert #rawData (employeeId, invoiceYear, Price, Cm, St1, St2)
select
EmployeID
, year(InvoiceDate) as InvoiceYear
, Price
, Cm
, St1
, St2
from
<SourceQuery>
where
InvoiceDate between @sdate and @eDate
;
set @sDate = dateadd(yyyy, 1, @sDate);
set @eDate = dateadd(ms, -1, dateadd(yyyy, 1, @sDate));
end
-- dynamically pivot
select
a.EmployeeId
, ' + @piv1YearSelectionString + '
from
(
select
piv1.CompanyId, piv1.CompanyName, ' + @yearString + '
from
#rawData
pivot
(
max(Price)
for [invoiceYear] in (' + @yearString + ')
) as piv1
) a
group by
a.EmployeeId
order by
a.EmployeeId
';
-- run the query
execute(@query);
-- clean up
drop table #rawdata;
Was Sie bisher versucht haben? Wir helfen Ihnen gerne, aber Sie müssen sich auch selbst einbringen. –
Kürzlich bin ich zu SQL Coding umgezogen. Ich bin durch die wenigen Portale nach Pivot gegangen. Es sieht so aus, dass Pivot die Zeilen in Spalten umwandeln kann, aber ich habe keine Ahnung, wie ich mein Szenario erreichen kann. –
Dies ist absolut möglich, aber es ist ziemlich komplex in SQL Server zu tun, und in der Regel am Ende einige dynamische SQL zu tun. Ich habe in letzter Zeit das Gleiche gemacht, also kann ich Ihnen helfen, aber wenn Sie SQL noch nicht kennen, gibt es einige Dinge, über die Sie Fragen haben werden. Wenn Sie etwas nicht verstehen, fragen Sie bitte. –