2016-06-24 12 views
0

Ich habe zwei Tabellen und ich habe das gewünschte Ergebnis von CTE und unmittelbar nach CTE-Abfrage.PIVOT-Ergebnismenge, die durch eine Abfrage erzeugt wird, die unmittelbar nach CTE

Der einzige Teil, ich bin mir nicht sicher, wie Sie die Ergebnismenge von [Lead_Created_Month] Spalte schwenken. Ich muss wahrscheinlich die Ergebnismenge in eine Unterabfrage verpacken und ihr einen Alias ​​geben, aber nicht genau, wie. Dies ist mein Code, der gut funktioniert, um die gewünschte Ergebnismenge zu erzeugen, aber dann muss diese Ergebnismenge um die Spalte [Lead_Created_Month] gedreht werden.

USE DatabaseName 
GO 
Create Table #TempSales 
(
LeadID_fk int identity (1,1), 
[dateCreated] datetime 
) 

insert into #TempSales 
values 
(NULL), 
(getdate()), 
(getdate()), 
(NULL), 
(getdate()), 
(getdate()), 
(getdate()), 
(NULL), 
(getdate()), 
('2016-05-24 14:17:41.330'), 
('2016-03-24 14:17:41.330'), 
('2016-03-22 14:17:41.330'), 
('2016-03-21 14:17:41.330'), 
('2016-04-24 14:17:41.330'), 
(NULL); 

Create Table #TempLead 
(
LeadID int identity (1,1), 
[dateCreated] datetime 
) 

insert into #TempLead 
values 
(getdate()), 
(getdate()), 
(getdate()), 
(getdate()), 
(getdate()), 
(getdate()), 
(getdate()), 
(getdate()), 
(getdate()), 
('2016-05-24 14:17:41.330'), 
('2016-03-24 14:17:41.330'), 
('2016-03-22 14:17:41.330'), 
('2016-03-21 14:17:41.330'), 
('2016-04-24 14:17:41.330'), 
(getdate()); 
Select * from #TempLead; 
Select * from #TempSales 

;with cte 
as 
(Select * from #TempLead) 
select count(l.LeadID) as [count of Leads], count(s.LeadID_fk) as [count of Sales], 
Cast(datepart(mm,[l].[dateCreated]) as varchar(2))+'/'+ 
--Cast(datepart(dd,[dateCreated]) as varchar(3))+'/'+ 
Cast(datepart(yyyy,[l].[dateCreated]) as varchar(5)) as [Lead_Created_Month] 
from cte as l 
    left join #TempSales as s on s.LeadID_fk=l.LeadID 
    and s.[dateCreated] is not null 
    group by Cast(datepart(mm,[l].[dateCreated]) as varchar(2))+'/'+ 
    Cast(datepart(yyyy,[l].[dateCreated]) as varchar(5)) 

Die obige Abfrage gibt die folgende Ausgabe: Current result sent

Das Endergebnis Satz sollte wie folgt aussehen:

final result set

Wie Sie meinen Code sehen können, fehlt Berechnung der Umrechnungsprozentsatz

Also schrieb ich diesen Code, es zu berechnen:

--,Cast((Select count([s].LeadID_fk) from #TempSales as s where [s].[dateCreated] is not null 
--/* group by Cast(datepart(mm,[s].[dateCreated]) as varchar(2)) +'/'+ Cast(datepart(yyyy,[s].[dateCreated]) as varchar(5)) */ 
--)/count([l].LeadID) *100 as nvarchar(10)) + '%' as Conversion 

Aber dies bewirkt, dass diese Warnmeldung in SSMS erscheinen, die korrekt ist. Mir ist nur keine bessere Lösung bekannt.

Msg 512, Ebene 16, Status 1, Zeile 1 Unterabfrage gab mehr als 1> Wert. Dies ist nicht erlaubt, wenn die Unterabfrage folgt =,! =, <, < =,>>,> = oder wenn die Unterabfrage als Ausdruck verwendet wird.

Antwort

1

Ich glaube, Sie so etwas wie dieses benötigen, wenn Sie eine Pivot verwenden möchten - und Sie müssten dynamische SQL verwenden, wenn Sie zu hart Code jjjjmm nicht wollen.

;with cte as 
(
select 1 as srce,year(tl.dateCreated) *100 + month(tl.dateCreated) as yyyymm,count(*) as leadcount 
from #templead tl 
group by year(tl.dateCreated) *100 + month(tl.dateCreated) 
union all 
select 2 as srce,year(ts.dateCreated) *100 + month(ts.dateCreated) ,count(*) as leadcount 
from  #tempsales ts 
group by year(ts.dateCreated) *100 + month(ts.dateCreated) 
) 
select case 
      when t.srce = 1 then 'leads' 
      when t.srce = 2 then 'sales' 
      when t.srce = 3 then 'comversions' 
      end as ' ' 
      ,t.[201603],t.[201604],t.[201605],t.[201606] 
from 
(
select pvt.* from 
(
select 1 srce,year(tl.dateCreated) *100 + month(tl.dateCreated) as yyyymm,1 as leadcount 
from #templead tl 
) s 
pivot (sum(s.leadcount) for s.yyyymm in ([201603],[201604],[201605],[201606])) pvt 
union all 
select pvt.* from 
(
select 2 srce,year(ts.dateCreated) *100 + month(ts.dateCreated) as yyyymm,1 as leadcount 
from #tempsales ts 
) s 
pivot (sum(s.leadcount) for s.yyyymm in ([201603],[201604],[201605],[201606])) pvt 
union all 
select * from 
(
select 3 srce,c1.yyyymm,cast(cast(c2.leadcount as decimal (10,5))/cast(c1.leadcount as decimal(10,5)) * 100 as int) as conversion 
from cte c1 
join cte c2 on c1.yyyymm = c2.yyyymm and c2.srce = 2 
where c1.srce = 1 
) s 
pivot (max(s.conversion) for s.yyyymm in ([201603],[201604],[201605],[201606])) pvt 
) t 
+0

Vielen Dank. Nur eine Frage, wie kann ich Cast oder Convert in der Conversion PIVOT Ausgabe verwenden? Dies sind die letzten beiden Zeilen Ihres obigen Codes: pivot (max. (S.konversion) für s.yyyymm in ([201603], [201604], [201605], [201606])) pvt ) t; – enigma6205

+0

Sie können case-Anweisungen hinzufügen, wie \t \t Fall \t \t \t wenn t.srce = 3 dann gegossen (t. [201603] als varchar (max)) + '%' \t \t \t sonst Besetzung (t. [201603 ] als varchar (max)) \t \t \t Ende als [201603] in der Auswahl sofort nach der Cte-Definition –