2016-06-09 13 views
0

Ich muss Zeilen Daten in Spalten unter einer bestimmten Bedingung transformieren. Nehmen wir an, dass wir im Jahr 2015 sind, dann muss es Daten aus dem nächsten Jahr als neue Spalte holen. Bitte schauen Sie sich die Tabelle A an und kann jemand vorschlagen, wie ich das erwartete Ergebnis erreichen kann?Zeilen in Spalten in SQL Server (möglicherweise Pivot)

Tabelle A:


EmpID Year  Price  Cm  St1 St2 
03  2015  1  AB  1   0 
03  2016  2  CD  0   1 
04  2016  2  XY  0   1 
04  2015  20  ZX  0   1 

Erwartete Ausgabe:


EmpID Year Y1_Price Y1_Cm Y1_St1 Y1_St2 Y2_Price Y2_Cm Y2_St1 Y2_St2 
03  2015 1  AB  1  0  2  CD  0  1 
03  2016 2  CD  0  1  NULL  NULL NULL NULL 
04  2016 2  XY  0  1  NULL  NULL NULL NULL 
04  2015 20  ZX  0  1  2  XY  0  1 

Bitte helfen Sie mir die SQL für das folgende Szenario

+0

Was Sie bisher versucht haben? Wir helfen Ihnen gerne, aber Sie müssen sich auch selbst einbringen. –

+0

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. –

+0

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. –

Antwort

3

Bitte komplizieren über die Sache. Ich habe ungefähr 10 Minuten damit verbracht, diese Anfrage zu schreiben, und es ist sehr einfach, dies zu erreichen.

@Sandeep - Verwenden Sie unten Skript und es wird Ihnen genau geben, was Sie suchen. Angenommen, Test ist Ihr Tabellenname.

Abfrage:

WITH CTE AS 
(
SELECT EmpId, Year, Price, Cm, St1, St2, ROW_NUMBER() OVER(PARTITION BY EmpId ORDER BY Year) RNo 
FROM TEST 
) 
SELECT T1.EmpId, T1.Year 
    , T1.Price Y1_Price, T1.Cm Y1_Cm, T1.St1 Y1_St1, T1.St2 Y1_St2 
    , T2.Price Y2_Price, T2.Cm Y2_Cm, T2.St1 Y2_St1, T2.St2 Y2_St2 
FROM CTE T1 
LEFT JOIN CTE T2 ON T1.EmpId = T2.EmpId AND T1.RNo + 1 = T2.RNo 
1

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; 
2

Angenommen, Sie sind ein Jahr über Jahr-Vergleich tun

Declare @Table table (EmpID varchar(25),Year int,Price money,CM varchar(25), St1 int,St2 int) 
Insert into @Table (EmpID,Year,Price,Cm,St1,St2) values 
('03',2015,1,'AB',1,0), 
('03',2016,2,'CD', 0,1), 
('04',2016,2,'XY',0,1), 
('04',2015,20,'ZX',0,1) 

Select A.EmpID 
     ,A.Year 
     ,Y1_Price = A.Price 
     ,Y1_CM = A.CM 
     ,Y1_St1 = A.ST1 
     ,Y1_St2 = A.ST2 
     ,Y2_Price = B.Price 
     ,Y2_CM = B.CM 
     ,Y2_St1 = B.ST1 
     ,Y2_St2 = B.ST2 
From @Table A 
Left Join @Table B on (A.EmpID = B.EmpID and A.Year+1=B.Year) 

Returns

EmpID Year Y1_Price Y1_CM Y1_St1 Y1_St2 Y2_Price Y2_CM Y2_St1 Y2_St2 
03  2015 1.00  AB  1  0  2.00  CD  0  1 
03  2016 2.00  CD  0  1  NULL  NULL NULL NULL 
04  2016 2.00  XY  0  1  NULL  NULL NULL NULL 
04  2015 20.00  ZX  0  1  2.00  XY  0  1