好吧,这个很难。我确信一些使用PIVOT声明是答案,但我不够知识足以形成正确的查询。我认为AVG也扔我循环。活跃的当月SSMS SQL - AVG在PIVOT中返回总计,而不是平均值
我有一个查询将返回正是我想要的,但它给出了结果的成员
我要找的只是每个月的总成本/数量每行一个月的时间段的形式,我希望将每月的时间段的平均值作为列标题。
我已经得到建立一个动态查询,以指定所需的字段的手段用于列标题,并在使用SELECT和PIVOT查询报表,并能正常工作,而相反而不是平均,查询似乎只是简单地提供那段时间的付款。
在下面的代码中,第一个查询CTE的结果包含正确的信息,但是包含行,而不是列。实质上,我需要能够透视数据以提供每月期间(Eff_Period)作为列标题和特定期间的平均成本(,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 S,而不是AVG秒。
我没有那么多需要的答案,因为一个人说,“spoonfed”给我;只是一些迹象表明我在做什么错在PIVOT查询将是有帮助的。
让我提前说,任何帮助将不胜感激。感谢名单!
其实,编辑是错误的。在医疗保健行业,被称为PMPM的供应商有一个价值;每个成员每月。这不是每个成员的价值,而是一种手段,看看每个成员在整个设施上花费了多少。 因此,如果10月份的医疗费用为200美元,而当月有50名活跃成员,则PMPM为200美元/ 50美元,即4美元。没有列出每个成员,但是按医生,设施,医院分组,无论哪个实体的价值正在确定。 重读我发布的内容,尽管如此,我本可以更好地说明这一部分。 – AdamQuark