2017-11-10 262 views
2

好吧,这个很难。我确信一些使用PIVOT声明是答案,但我不够知识足以形成正确的查询。我认为AVG也扔我循环。活跃的当月SSMS SQL - AVG在PIVOT中返回总计,而不是平均值

我有一个查询将返回正是我想要的,但它给出了结果的成员

我要找的只是每个月的总成本/数量每行一个月的时间段的形式,我希望将每月的时间段的平均值作为列标题。

我已经得到建立一个动态查询,以指定所需的字段的手段用于列标题,并在使用SELECTPIVOT查询报表,并能正常工作,而相反而不是平均,查询似乎只是简单地提供那段时间的付款。

在下面的代码中,第一个查询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查询将是有帮助的。

让我提前说,任何帮助将不胜感激。感谢名单!

+0

其实,编辑是错误的。在医疗保健行业,被称为PMPM的供应商有一个价值;每个成员每月。这不是每个成员的价值,而是一种手段,看看每个成员在整个设施上花费了多少。 因此,如果10月份的医疗费用为200美元,而当月有50名活跃成员,则PMPM为200美元/ 50美元,即4美元。没有列出每个成员,但是按医生,设施,医院分组,无论哪个实体的价值正在确定。 重读我发布的内容,尽管如此,我本可以更好地说明这一部分。 – AdamQuark

回答

0

编辑:提供结果集作为月内索赔平均数/会员数的方法。

真是太棒了!如果我理解正确,我认为以下内容应该有助于指导你。无论是否在当月提出索赔,它都会输出全年电网。

请注意,我删除了动态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获取要查找的列(月)。

+0

Thanx的帖子,pim,我现在摆弄它。 您的代码为每个成员分别提供一行,但我只查找每个月的总费用/当月活动的成员数量。 我修改了代码来返回一行,但我不知道它是如何得到它的值。仍在努力。 我会发布我修改它的方式,但似乎并不是注释字段中的一个选项。 Thanx再次,但我会插在上面! – AdamQuark

+0

@AdamQuark我将更新我的回复。坚持下去。 – pimbrouwers

+0

@AdamQuark我已经更新了我的回复,其中包括第三个cte和对第二个cte组的修改。我认为这更接近你要找的东西。 – pimbrouwers

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