【发布时间】:2017-11-10 20:02:55
【问题描述】:
好的,这个很难。我确信使用 PIVOT 语句是答案,但我的知识不足以形成正确的查询。我认为 AVG 也让我陷入了困境。
我正在寻找每个月的总费用/当月活跃的会员数量
我有一个查询将准确返回我想要的结果,但它以每行一个月周期的形式给出结果,我想要以月周期作为列标题的单行平均值。
我已经获得了创建动态查询的方法,以指定用于列标题以及在查询的 SELECT 和 PIVOT 语句中使用的必要字段,并且效果很好,但是,查询似乎只是提供了该期间付款的SUM,而不是平均。
在下面的代码中,第一个查询(即 CTE 查询)的结果包含正确的信息,但作为行而不是列。本质上,我需要能够对数据进行透视,以提供每月期间 (Eff_Period) 作为列标题,并将特定期间的平均成本 (Clms_PMPM) 作为列的值。
这是整个查询,其中声明并填充了示例临时表以供在其中使用(我希望我做对了);
--------------------
/*
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 查询中指出我做错了什么会有所帮助。
让我提前说,任何帮助将不胜感激。谢谢!
【问题讨论】:
-
其实那个编辑是错误的。在医疗保健行业,为提供者分配了一个价值,称为 PMPM。每个会员每月。它不是每个成员的值,而是查看每个成员为整个设施花费了多少的方法。因此,如果 10 月份的医疗保健费用为 200 美元,并且当月有 50 名活跃会员,则 PMPM 为 200 美元/50 美元,即 4 美元。它不是针对每个成员列出的,而是按医生、设施、医院以及正在确定其价值的实体分组。不过,重读我发布的内容,我可以更好地措辞。
标签: sql sql-server pivot ssms average