我正在寻找每个月的总费用/当月活跃的会员数
我有一个查询会返回我想要的内容,但它会以每行一个月的周期形式给出结果,我想要一行平均值,每月一次作为列标题。
我已经有了创建动态查询的方法,以指定用于列标题的必要字段以及用于查询的 SELECT 和 PIVOT 语句,并且工作正常,但是,查询似乎只是提供该期间付款的 SUM ,而不是平均。
在下面的代码中,第一个查询(CTE one)的结果包含正确的信息,但是作为行而不是列。基本上,我需要能够透过数据来提供月度周期( Eff_Period )作为列标题和特定时期的平均成本( _P_PM )作为列的值。
这是整个查询,其中声明并填充了样本临时表以供在其中使用(我希望我能做到这一点);
--------------------
/*
Create member table.
*/
CREATE TABLE #Mbr_Data
(
Member_Name nvarchar(50) NULL,
MemberID nvarchar(4) NULL,
Eff_Period nvarchar(6) NULL,
);
--------------------
/*
Create claim table.
*/
CREATE TABLE #Clm_Data
(
Clm_Dt date NULL,
Clm_Amt money NULL,
Mbr_ID nvarchar(6) NULL,
);
--------------------
/*
Populate member table.
*/
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201601');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201602');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201603');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201604');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201605');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201606');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201607');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201608');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201609');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201610');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201611');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201612');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201701');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201702');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201703');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201704');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201705');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201706');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201707');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201708');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201709');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201710');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201711');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201712');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201607');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201608');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201609');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201610');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201611');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201612');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201701');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201702');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201703');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201704');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201705');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201706');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201707');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201708');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201709');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201710');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201711');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201712');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201601');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201602');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201603');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201604');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201605');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201606');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201607');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201608');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201609');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201610');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201611');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201612');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201701');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201702');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201703');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201704');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201705');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201706');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201607');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201608');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201609');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201610');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201611');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201612');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201701');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201702');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201703');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201704');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201602');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201603');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201604');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201605');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201606');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201607');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201608');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201609');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201610');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201707');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201708');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201709');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201710');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201711');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201712');
--------------------
/*
Populate claim table.
*/
INSERT INTO #Clm_Data VALUES ('2017-02-27', '523.37', '0004');
INSERT INTO #Clm_Data VALUES ('2016-08-24', '815.58', '0005');
INSERT INTO #Clm_Data VALUES ('2017-01-08', '541.91', '0004');
INSERT INTO #Clm_Data VALUES ('2016-12-08', '775.45', '0004');
INSERT INTO #Clm_Data VALUES ('2016-08-12', '177.44', '0003');
INSERT INTO #Clm_Data VALUES ('2017-01-19', '253.02', '0003');
INSERT INTO #Clm_Data VALUES ('2017-05-12', '539.29', '0003');
INSERT INTO #Clm_Data VALUES ('2016-08-23', '86.85', '0002');
INSERT INTO #Clm_Data VALUES ('2017-11-24', '869.67', '0002');
INSERT INTO #Clm_Data VALUES ('2016-10-15', '263.96', '0004');
INSERT INTO #Clm_Data VALUES ('2017-08-21', '111.27', '0001');
INSERT INTO #Clm_Data VALUES ('2016-06-17', '716.69', '0003');
INSERT INTO #Clm_Data VALUES ('2017-06-21', '754.21', '0002');
INSERT INTO #Clm_Data VALUES ('2016-06-12', '330.57', '0001');
INSERT INTO #Clm_Data VALUES ('2016-04-11', '770.02', '0001');
INSERT INTO #Clm_Data VALUES ('2016-07-13', '629', '0002');
INSERT INTO #Clm_Data VALUES ('2016-08-22', '876.02', '0001');
INSERT INTO #Clm_Data VALUES ('2017-03-21', '72.06', '0005');
INSERT INTO #Clm_Data VALUES ('2017-02-13', '249.11', '0005');
INSERT INTO #Clm_Data VALUES ('2017-08-13', '922.89', '0002');
INSERT INTO #Clm_Data VALUES ('2017-03-29', '760.59', '0003');
INSERT INTO #Clm_Data VALUES ('2017-01-10', '901.51', '0002');
INSERT INTO #Clm_Data VALUES ('2016-02-04', '432.17', '0003');
INSERT INTO #Clm_Data VALUES ('2017-02-14', '628.23', '0003');
INSERT INTO #Clm_Data VALUES ('2017-08-08', '718.05', '0002');
INSERT INTO #Clm_Data VALUES ('2016-12-28', '931.81', '0004');
INSERT INTO #Clm_Data VALUES ('2016-10-10', '973.44', '0002');
INSERT INTO #Clm_Data VALUES ('2017-08-26', '910.89', '0005');
INSERT INTO #Clm_Data VALUES ('2017-03-09', '613.04', '0004');
INSERT INTO #Clm_Data VALUES ('2017-07-14', '490.26', '0002');
INSERT INTO #Clm_Data VALUES ('2017-02-23', '941.18', '0005');
INSERT INTO #Clm_Data VALUES ('2017-06-19', '506.74', '0005');
INSERT INTO #Clm_Data VALUES ('2016-08-04', '970.9', '0001');
INSERT INTO #Clm_Data VALUES ('2016-11-13', '205.61', '0004');
INSERT INTO #Clm_Data VALUES ('2017-03-12', '580.84', '0002');
INSERT INTO #Clm_Data VALUES ('2016-09-25', '661.63', '0002');
INSERT INTO #Clm_Data VALUES ('2016-07-14', '391.89', '0004');
INSERT INTO #Clm_Data VALUES ('2016-12-16', '353.55', '0002');
INSERT INTO #Clm_Data VALUES ('2016-04-04', '284.09', '0005');
INSERT INTO #Clm_Data VALUES ('2016-07-16', '479.56', '0003');
INSERT INTO #Clm_Data VALUES ('2016-09-28', '276.65', '0002');
INSERT INTO #Clm_Data VALUES ('2016-08-06', '145.05', '0004');
INSERT INTO #Clm_Data VALUES ('2016-09-14', '947.97', '0001');
INSERT INTO #Clm_Data VALUES ('2016-09-24', '18.18', '0003');
INSERT INTO #Clm_Data VALUES ('2017-06-14', '489.54', '0001');
INSERT INTO #Clm_Data VALUES ('2017-08-06', '260.04', '0005');
INSERT INTO #Clm_Data VALUES ('2016-09-02', '224.2', '0001');
INSERT INTO #Clm_Data VALUES ('2017-12-23', '301.42', '0005');
INSERT INTO #Clm_Data VALUES ('2016-10-05', '636.12', '0004');
INSERT INTO #Clm_Data VALUES ('2017-06-26', '126.39', '0002');
INSERT INTO #Clm_Data VALUES ('2016-12-18', '156.15', '0001');
INSERT INTO #Clm_Data VALUES ('2016-11-21', '425.58', '0004');
INSERT INTO #Clm_Data VALUES ('2016-04-29', '619.03', '0001');
INSERT INTO #Clm_Data VALUES ('2016-07-07', '847.73', '0003');
INSERT INTO #Clm_Data VALUES ('2016-12-17', '143.94', '0001');
INSERT INTO #Clm_Data VALUES ('2016-02-24', '897.7', '0001');
INSERT INTO #Clm_Data VALUES ('2017-02-08', '130.13', '0002');
INSERT INTO #Clm_Data VALUES ('2017-01-02', '400.07', '0001');
INSERT INTO #Clm_Data VALUES ('2017-03-26', '289.36', '0004');
INSERT INTO #Clm_Data VALUES ('2016-07-26', '193.25', '0003');
INSERT INTO #Clm_Data VALUES ('2017-03-27', '585.15', '0005');
INSERT INTO #Clm_Data VALUES ('2016-11-06', '885.48', '0002');
INSERT INTO #Clm_Data VALUES ('2016-12-30', '104.55', '0003');
INSERT INTO #Clm_Data VALUES ('2017-10-08', '554.54', '0002');
INSERT INTO #Clm_Data VALUES ('2017-04-15', '37.34', '0004');
INSERT INTO #Clm_Data VALUES ('2017-06-17', '742.19', '0002');
INSERT INTO #Clm_Data VALUES ('2016-11-23', '527.78', '0004');
INSERT INTO #Clm_Data VALUES ('2017-06-06', '116.95', '0002');
INSERT INTO #Clm_Data VALUES ('2016-09-13', '408.24', '0004');
INSERT INTO #Clm_Data VALUES ('2016-09-12', '520.77', '0002');
INSERT INTO #Clm_Data VALUES ('2017-04-03', '325', '0001');
INSERT INTO #Clm_Data VALUES ('2016-11-13', '16.53', '0005');
INSERT INTO #Clm_Data VALUES ('2016-07-06', '845.77', '0004');
INSERT INTO #Clm_Data VALUES ('2016-08-21', '604.06', '0003');
INSERT INTO #Clm_Data VALUES ('2017-06-12', '47', '0001');
INSERT INTO #Clm_Data VALUES ('2017-05-06', '778.23', '0001');
INSERT INTO #Clm_Data VALUES ('2017-06-03', '507.67', '0002');
INSERT INTO #Clm_Data VALUES ('2016-10-20', '572.65', '0003');
INSERT INTO #Clm_Data VALUES ('2017-06-30', '764.08', '0005');
INSERT INTO #Clm_Data VALUES ('2016-08-19', '153.46', '0001');
INSERT INTO #Clm_Data VALUES ('2016-08-26', '491.57', '0005');
INSERT INTO #Clm_Data VALUES ('2016-04-18', '673.71', '0001');
INSERT INTO #Clm_Data VALUES ('2016-07-15', '830.9', '0001');
INSERT INTO #Clm_Data VALUES ('2017-10-06', '688.26', '0005');
INSERT INTO #Clm_Data VALUES ('2016-04-25', '676.57', '0001');
INSERT INTO #Clm_Data VALUES ('2016-04-11', '622.61', '0003');
INSERT INTO #Clm_Data VALUES ('2016-11-04', '723.65', '0005');
INSERT INTO #Clm_Data VALUES ('2016-07-31', '579.48', '0005');
INSERT INTO #Clm_Data VALUES ('2017-03-03', '831.47', '0003');
INSERT INTO #Clm_Data VALUES ('2016-12-22', '568.48', '0002');
INSERT INTO #Clm_Data VALUES ('2016-05-29', '800.18', '0005');
INSERT INTO #Clm_Data VALUES ('2017-08-19', '439.59', '0005');
INSERT INTO #Clm_Data VALUES ('2016-08-07', '396.01', '0001');
INSERT INTO #Clm_Data VALUES ('2016-10-26', '538.43', '0004');
INSERT INTO #Clm_Data VALUES ('2017-07-04', '382.15', '0005');
INSERT INTO #Clm_Data VALUES ('2017-12-30', '126.15', '0005');
INSERT INTO #Clm_Data VALUES ('2016-10-30', '195.71', '0005');
INSERT INTO #Clm_Data VALUES ('2017-08-06', '446.5', '0001');
INSERT INTO #Clm_Data VALUES ('2016-10-06', '484.34', '0003');
INSERT INTO #Clm_Data VALUES ('2016-11-20', '254.37', '0004');
--------------------
/*
CTE method.
*/
WITH
Mbrs_CTE AS
(
SELECT
Eff_Period,
COUNT(DISTINCT MemberID) AS Mbr_Cnt
FROM
#Mbr_Data
GROUP BY
Eff_Period
),
Clms_CTE AS
(
SELECT DISTINCT
FORMAT(Clm_Dt, 'yyyyMM') AS Eff_Period,
SUM(Clm_Amt) OVER (PARTITION BY FORMAT(Clm_Dt, 'yyyyMM')) AS Clm_Pmts
FROM
#Clm_Data
)
SELECT
Mbrs.Eff_Period,
Mbrs.Mbr_Cnt,
Clm_S.Clm_Pmts,
Clm_S.Clm_Pmts / Mbrs.Mbr_Cnt AS Clms_PMPM
FROM
Mbrs_CTE AS Mbrs
JOIN Clms_CTE AS Clm_S
ON Clm_S.Eff_Period = Mbrs.Eff_Period;
--------------------
/*
Dynamic query method.
*/
DECLARE
@columns NVARCHAR(MAX),
@sql NVARCHAR(MAX);
SET @columns = '';
SELECT
@columns += ',' + QUOTENAME(Eff_Period)
FROM
(
SELECT DISTINCT TOP 100 PERCENT
Mbrs.Eff_Period
FROM
#Mbr_Data AS Mbrs
INNER JOIN #Clm_Data AS Clms
ON
Mbrs.Eff_Period = FORMAT(Clms.Clm_Dt, 'yyyyMM')
AND YEAR(Clms.Clm_Dt) = 2016
ORDER BY
Mbrs.Eff_Period
) AS Raw_Data
ORDER BY
Eff_Period;
PRINT @columns
SET @sql =
'
WITH
Mbrs_CTE AS
(
SELECT
Eff_Period,
COUNT(DISTINCT MemberID) AS Mbr_Cnt
FROM
#Mbr_Data
GROUP BY
Eff_Period
),
Clms_CTE AS
(
SELECT
Mbrs.Eff_Period,
Mbrs.Mbr_Cnt,
SUM(Clms.Clm_Amt) AS Sum_Amt
FROM
Mbrs_CTE AS Mbrs
LEFT OUTER JOIN #Clm_Data AS Clms
ON
Mbrs.Eff_Period = FORMAT(Clms.Clm_Dt, ''yyyyMM'')
AND YEAR(Clms.Clm_Dt) = 2016
GROUP BY
Mbrs.Eff_Period,
Mbrs.Mbr_Cnt
)
SELECT
' + STUFF(@columns, 1, 1, '') + '
FROM
(
SELECT
Clms.Eff_Period,
Clms.sum_Amt
FROM
Mbrs_CTE AS Mbrs
INNER JOIN Clms_CTE AS Clms
ON Clms.Eff_Period = Mbrs.Eff_Period
) AS sor
PIVOT
(
AVG(sum_Amt) FOR Eff_Period IN
('
+ STUFF(@columns, 1, 1, '')
+ ')
) AS pvt;
';
PRINT @sql;
EXEC sp_executesql @sql;
--------------------
第二个查询的形式是正确的,只是它似乎提供了 SUM ,而不是 AVG 。
我不太需要答案,正如人们所说," spoonfed "对我来说;只是在 PIVOT 查询中出现错误的一些迹象会有所帮助。
我先提前说,我们将非常感谢任何帮助。感谢名单!
答案 0 :(得分:1)
编辑:提供结果集作为月内索赔平均值/成员计数的方法。
真是太棒了!如果我理解正确,我认为以下内容应该有助于指导您。无论是否在当月提出索赔,它都会输出整年的网格。
请注意,我删除了动态sql部分,因为我将该部分留给您解释,将下面的旋转结果作为输入进行解释。我还在第二个CTE中的特定年份过滤器中进行了硬编码,这可以简单地用变量替换和/或使得更复杂以解释月,日等。
;with memberClaimsByMonth as
(
select
m.MemberID as MemberId
,year(c.Clm_dt) as ClaimYear
,month(c.Clm_dt) as ClaimMonth
,c.Clm_Amt as ClaimAmount
from
#Mbr_Data m
join
#Clm_Data c
on c.Mbr_ID = m.MemberID
),
memberAvgClaimByMonth as (
select
c.ClaimMonth
,count(c.MemberId) as MemberCount
,avg(c.ClaimAmount) as ClaimAvg
from
memberClaimsByMonth c
where
c.ClaimYear = 2016
group by
c.ClaimMonth
),
claimAvgOverMemberCount as (
select
c.ClaimMonth
,c.ClaimAvg / c.MemberCount as ClaimAvgOverCount
from
memberAvgClaimByMonth c
)
select
*
from
claimAvgOverMemberCount c
pivot
(
avg(c.ClaimAvgOverCount)
for ClaimMonth in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) p
我认为关键的一点是PIVOT
利用AVG()
来衡量一年中的所有月份。要动态过滤,您可以将数据透视查询封装到CTE中(或将结果放入临时表中)并使用动态sql来获取您正在寻找的列(月)。
答案 1 :(得分:0)
有一个可以按我想要的版本。这是一组样本数据的最终代码集;
--------------------
/*
Create member table.
*/
CREATE TABLE #Mbr_Data
(
Member_Name nvarchar(50) NULL,
MemberID nvarchar(4) NULL,
Eff_Period nvarchar(6) NULL,
);
--------------------
/*
Create claim table.
*/
CREATE TABLE #Clm_Data
(
Clm_Dt date NULL,
Clm_Amt money NULL,
Mbr_ID nvarchar(6) NULL,
);
--------------------
/*
Populate member table.
*/
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201601');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201602');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201603');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201604');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201605');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201606');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201607');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201608');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201609');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201610');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201611');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201612');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201701');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201702');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201703');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201704');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201705');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201706');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201707');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201708');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201709');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201710');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201711');
INSERT INTO #Mbr_Data VALUES ('Bob', '0001', '201712');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201607');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201608');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201609');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201610');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201611');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201612');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201701');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201702');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201703');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201704');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201705');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201706');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201707');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201708');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201709');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201710');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201711');
INSERT INTO #Mbr_Data VALUES ('Marie', '0002', '201712');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201601');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201602');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201603');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201604');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201605');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201606');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201607');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201608');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201609');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201610');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201611');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201612');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201701');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201702');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201703');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201704');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201705');
INSERT INTO #Mbr_Data VALUES ('Antoine', '0003', '201706');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201607');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201608');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201609');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201610');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201611');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201612');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201701');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201702');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201703');
INSERT INTO #Mbr_Data VALUES ('Frank', '0004', '201704');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201602');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201603');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201604');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201605');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201606');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201607');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201608');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201609');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201610');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201707');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201708');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201709');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201710');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201711');
INSERT INTO #Mbr_Data VALUES ('Sue', '0005', '201712');
--------------------
/*
Populate claim table.
*/
INSERT INTO #Clm_Data VALUES ('2017-02-27', '523.37', '0004');
INSERT INTO #Clm_Data VALUES ('2016-08-24', '815.58', '0005');
INSERT INTO #Clm_Data VALUES ('2017-01-08', '541.91', '0004');
INSERT INTO #Clm_Data VALUES ('2016-12-08', '775.45', '0004');
INSERT INTO #Clm_Data VALUES ('2016-08-12', '177.44', '0003');
INSERT INTO #Clm_Data VALUES ('2017-01-19', '253.02', '0003');
INSERT INTO #Clm_Data VALUES ('2017-05-12', '539.29', '0003');
INSERT INTO #Clm_Data VALUES ('2016-08-23', '86.85', '0002');
INSERT INTO #Clm_Data VALUES ('2017-11-24', '869.67', '0002');
INSERT INTO #Clm_Data VALUES ('2016-10-15', '263.96', '0004');
INSERT INTO #Clm_Data VALUES ('2017-08-21', '111.27', '0001');
INSERT INTO #Clm_Data VALUES ('2016-06-17', '716.69', '0003');
INSERT INTO #Clm_Data VALUES ('2017-06-21', '754.21', '0002');
INSERT INTO #Clm_Data VALUES ('2016-06-12', '330.57', '0001');
INSERT INTO #Clm_Data VALUES ('2016-04-11', '770.02', '0001');
INSERT INTO #Clm_Data VALUES ('2016-07-13', '629', '0002');
INSERT INTO #Clm_Data VALUES ('2016-08-22', '876.02', '0001');
INSERT INTO #Clm_Data VALUES ('2017-03-21', '72.06', '0005');
INSERT INTO #Clm_Data VALUES ('2017-02-13', '249.11', '0005');
INSERT INTO #Clm_Data VALUES ('2017-08-13', '922.89', '0002');
INSERT INTO #Clm_Data VALUES ('2017-03-29', '760.59', '0003');
INSERT INTO #Clm_Data VALUES ('2017-01-10', '901.51', '0002');
INSERT INTO #Clm_Data VALUES ('2016-02-04', '432.17', '0003');
INSERT INTO #Clm_Data VALUES ('2017-02-14', '628.23', '0003');
INSERT INTO #Clm_Data VALUES ('2017-08-08', '718.05', '0002');
INSERT INTO #Clm_Data VALUES ('2016-12-28', '931.81', '0004');
INSERT INTO #Clm_Data VALUES ('2016-10-10', '973.44', '0002');
INSERT INTO #Clm_Data VALUES ('2017-08-26', '910.89', '0005');
INSERT INTO #Clm_Data VALUES ('2017-03-09', '613.04', '0004');
INSERT INTO #Clm_Data VALUES ('2017-07-14', '490.26', '0002');
INSERT INTO #Clm_Data VALUES ('2017-02-23', '941.18', '0005');
INSERT INTO #Clm_Data VALUES ('2017-06-19', '506.74', '0005');
INSERT INTO #Clm_Data VALUES ('2016-08-04', '970.9', '0001');
INSERT INTO #Clm_Data VALUES ('2016-11-13', '205.61', '0004');
INSERT INTO #Clm_Data VALUES ('2017-03-12', '580.84', '0002');
INSERT INTO #Clm_Data VALUES ('2016-09-25', '661.63', '0002');
INSERT INTO #Clm_Data VALUES ('2016-07-14', '391.89', '0004');
INSERT INTO #Clm_Data VALUES ('2016-12-16', '353.55', '0002');
INSERT INTO #Clm_Data VALUES ('2016-04-04', '284.09', '0005');
INSERT INTO #Clm_Data VALUES ('2016-07-16', '479.56', '0003');
INSERT INTO #Clm_Data VALUES ('2016-09-28', '276.65', '0002');
INSERT INTO #Clm_Data VALUES ('2016-08-06', '145.05', '0004');
INSERT INTO #Clm_Data VALUES ('2016-09-14', '947.97', '0001');
INSERT INTO #Clm_Data VALUES ('2016-09-24', '18.18', '0003');
INSERT INTO #Clm_Data VALUES ('2017-06-14', '489.54', '0001');
INSERT INTO #Clm_Data VALUES ('2017-08-06', '260.04', '0005');
INSERT INTO #Clm_Data VALUES ('2016-09-02', '224.2', '0001');
INSERT INTO #Clm_Data VALUES ('2017-12-23', '301.42', '0005');
INSERT INTO #Clm_Data VALUES ('2016-10-05', '636.12', '0004');
INSERT INTO #Clm_Data VALUES ('2017-06-26', '126.39', '0002');
INSERT INTO #Clm_Data VALUES ('2016-12-18', '156.15', '0001');
INSERT INTO #Clm_Data VALUES ('2016-11-21', '425.58', '0004');
INSERT INTO #Clm_Data VALUES ('2016-04-29', '619.03', '0001');
INSERT INTO #Clm_Data VALUES ('2016-07-07', '847.73', '0003');
INSERT INTO #Clm_Data VALUES ('2016-12-17', '143.94', '0001');
INSERT INTO #Clm_Data VALUES ('2016-02-24', '897.7', '0001');
INSERT INTO #Clm_Data VALUES ('2017-02-08', '130.13', '0002');
INSERT INTO #Clm_Data VALUES ('2017-01-02', '400.07', '0001');
INSERT INTO #Clm_Data VALUES ('2017-03-26', '289.36', '0004');
INSERT INTO #Clm_Data VALUES ('2016-07-26', '193.25', '0003');
INSERT INTO #Clm_Data VALUES ('2017-03-27', '585.15', '0005');
INSERT INTO #Clm_Data VALUES ('2016-11-06', '885.48', '0002');
INSERT INTO #Clm_Data VALUES ('2016-12-30', '104.55', '0003');
INSERT INTO #Clm_Data VALUES ('2017-10-08', '554.54', '0002');
INSERT INTO #Clm_Data VALUES ('2017-04-15', '37.34', '0004');
INSERT INTO #Clm_Data VALUES ('2017-06-17', '742.19', '0002');
INSERT INTO #Clm_Data VALUES ('2016-11-23', '527.78', '0004');
INSERT INTO #Clm_Data VALUES ('2017-06-06', '116.95', '0002');
INSERT INTO #Clm_Data VALUES ('2016-09-13', '408.24', '0004');
INSERT INTO #Clm_Data VALUES ('2016-09-12', '520.77', '0002');
INSERT INTO #Clm_Data VALUES ('2017-04-03', '325', '0001');
INSERT INTO #Clm_Data VALUES ('2016-11-13', '16.53', '0005');
INSERT INTO #Clm_Data VALUES ('2016-07-06', '845.77', '0004');
INSERT INTO #Clm_Data VALUES ('2016-08-21', '604.06', '0003');
INSERT INTO #Clm_Data VALUES ('2017-06-12', '47', '0001');
INSERT INTO #Clm_Data VALUES ('2017-05-06', '778.23', '0001');
INSERT INTO #Clm_Data VALUES ('2017-06-03', '507.67', '0002');
INSERT INTO #Clm_Data VALUES ('2016-10-20', '572.65', '0003');
INSERT INTO #Clm_Data VALUES ('2017-06-30', '764.08', '0005');
INSERT INTO #Clm_Data VALUES ('2016-08-19', '153.46', '0001');
INSERT INTO #Clm_Data VALUES ('2016-08-26', '491.57', '0005');
INSERT INTO #Clm_Data VALUES ('2016-04-18', '673.71', '0001');
INSERT INTO #Clm_Data VALUES ('2016-07-15', '830.9', '0001');
INSERT INTO #Clm_Data VALUES ('2017-10-06', '688.26', '0005');
INSERT INTO #Clm_Data VALUES ('2016-04-25', '676.57', '0001');
INSERT INTO #Clm_Data VALUES ('2016-04-11', '622.61', '0003');
INSERT INTO #Clm_Data VALUES ('2016-11-04', '723.65', '0005');
INSERT INTO #Clm_Data VALUES ('2016-07-31', '579.48', '0005');
INSERT INTO #Clm_Data VALUES ('2017-03-03', '831.47', '0003');
INSERT INTO #Clm_Data VALUES ('2016-12-22', '568.48', '0002');
INSERT INTO #Clm_Data VALUES ('2016-05-29', '800.18', '0005');
INSERT INTO #Clm_Data VALUES ('2017-08-19', '439.59', '0005');
INSERT INTO #Clm_Data VALUES ('2016-08-07', '396.01', '0001');
INSERT INTO #Clm_Data VALUES ('2016-10-26', '538.43', '0004');
INSERT INTO #Clm_Data VALUES ('2017-07-04', '382.15', '0005');
INSERT INTO #Clm_Data VALUES ('2017-12-30', '126.15', '0005');
INSERT INTO #Clm_Data VALUES ('2016-10-30', '195.71', '0005');
INSERT INTO #Clm_Data VALUES ('2017-08-06', '446.5', '0001');
INSERT INTO #Clm_Data VALUES ('2016-10-06', '484.34', '0003');
INSERT INTO #Clm_Data VALUES ('2016-11-20', '254.37', '0004');
--------------------
/*
Dynamic query method.
*/
DECLARE
@columns NVARCHAR(MAX),
@columns2 NVARCHAR(MAX),
@sql NVARCHAR(MAX);
SET @columns = '';
SELECT
@columns += ',' + QUOTENAME(Eff_Period)
FROM
(
SELECT DISTINCT TOP 100 PERCENT
Mbrs.Eff_Period
FROM
#Mbr_Data AS Mbrs
INNER JOIN #Clm_Data AS Clms
ON
Mbrs.Eff_Period = FORMAT(Clms.Clm_Dt, 'yyyyMM')
AND YEAR(Clms.Clm_Dt) = 2016
ORDER BY
Mbrs.Eff_Period
) AS Raw_Data
ORDER BY
Eff_Period;
SET @columns2 = REPLACE(REPLACE(REPLACE(STUFF(@columns, 1, 1, ''), '],[', ''','''),'[' , ''''), ']', '''');
PRINT @columns
PRINT @columns2
SET @sql =
'
WITH
Mbrs_CTE AS
(
SELECT
Eff_Period,
COUNT(DISTINCT MemberID) AS Mbr_Cnt
FROM
#Mbr_Data
GROUP BY
Eff_Period
),
Clms_CTE AS
(
SELECT DISTINCT
FORMAT(Clm_Dt, ''yyyyMM'') AS Eff_Period,
SUM(Clm_Amt) OVER (PARTITION BY FORMAT(Clm_Dt, ''yyyyMM'')) AS Clm_Pmts
FROM
#Clm_Data
),
PMPM_CTE AS
(
SELECT
Mbrs.Eff_Period,
Clm_S.Clm_Pmts / Mbrs.Mbr_Cnt AS Clms_PMPM
FROM
Mbrs_CTE AS Mbrs
JOIN Clms_CTE AS Clm_S
ON Clm_S.Eff_Period = Mbrs.Eff_Period
WHERE
Clm_S.Eff_Period IN (' + @columns2 + ')
)
SELECT
' + STUFF(@columns, 1, 1, '') + '
FROM
PMPM_CTE AS S
PIVOT(MAX(Clms_PMPM) FOR Eff_Period IN (' + STUFF(@columns, 1, 1, '') + ')) AS PMPM;
';
PRINT @sql;
EXEC sp_executesql @sql;
--------------------
DROP TABLE #Mbr_Data;
DROP TABLE #Clm_Data;
--------------------