2016-06-24 12 views
0

2つのテーブルがあり、CTEからの結果が得られ、CTEクエリの直後に次の結果が得られました。PTEOT結果セットCTE直後のクエリ

私は、[Lead_Created_Month]列で結果セットをピボットする方法についてはわかりません。結果セットをサブクエリにラップし、エイリアスを付ける必要がありますが、正確な方法はわかりません。これは、目的の結果セットを生成するのにはうまくいく私のコードですが、この結果セットは[Lead_Created_Month]カラムによってピボットされる必要があります。

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)) 

上記のクエリは、次のような出力を返します。 Current result sent

最終的な結果セットは次のようになります。あなたは私のコードは、の計算が欠落している見ることができるように

final result set

コンバージョン率。

だから私はそれを計算するためにこのコードを書いた:

--,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 

しかし、これは正しいですSSMSに表示されるように、この警告メッセージが表示されます。それは私がもっと良い解決策を知らないことだけです。

メッセージレベル512、レベル16、状態1、行1サブクエリは1以上の値を返しました。 =、!=、<、< =、>>、> =、またはサブクエリが式として使用されている場合は、これは許可されません。

答えて

1

ピボットを使用したい場合は、yyyymmをハードコードしたくない場合は動的SQLを使用する必要があります。

;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

ありがとうございます。どのように変換PIVOTの出力でキャストまたは変換を使用することができますか?上記のコードの最後の2行です:([201603]、[201604]、[201605]、[201606]))のs.yyyymmのピボット(max(s.conversion))pvt )t; – enigma6205

+0

あなたが\t \t \t な\t \t場合 \t \t \tときt.srce = 3その後、キャスト(トン。[201603]はvarchar(MAX)など)+ '%' のようにcase文を追加することができ、他のキャスト(トン。[201603 ]としてvarchar(max)) \t \t \t end [201603]として、cte定義の直後のselect –