2017-11-10 255 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; 
--------------------