2017-11-10 3 views
2

OK, dieser ist schwierig. Ich bin sicher, dass einige der Verwendung der PIVOT-Anweisung die Antwort ist, aber ich bin nicht ausreichend genug, um die richtige Abfrage zu bilden. Ich denke, AVG wirft mich auch für eine Schleife.SSMS SQL - AVG in PIVOT Rückkehr Summen, keine Durchschnittswerte

Ich bin für jeden Monat/die Anzahl der aktiven Mitglieder in diesem Monat

Ich habe eine Abfrage nur für die Gesamtkosten suchen, genau zurückkehren, was ich will, aber es gibt die Ergebnisse in der Form einer monatlichen Periode pro Zeile und ich möchte eine einzelne Reihe von Durchschnitten mit der monatlichen Periode als Spaltenüberschriften.

ich ein Mittel bekommen hatte eine dynamische Abfrage zu erstellen, die erforderlichen Felder angeben, die für die Spaltenüberschriften verwendet werden und für die Verwendung in den SELECT und PIVOT Aussagen der Abfrage, und das funktioniert gut, aber eher als Mittelwertbildung scheint die Abfrage einfach die SUM der Zahlungen für diesen Zeitraum bereitzustellen.

Im folgenden Code enthalten die Ergebnisse aus der ersten Abfrage, die CTE, die richtigen Informationen, aber als Zeilen, anstatt als Spalten. Im Wesentlichen muss ich in der Lage sein, die Daten zu schwenken, um den monatlichen Zeitraum (Eff_Period) als Spaltenüberschriften und die Durchschnittskosten (Clms_PMPM) für den spezifischen Zeitraum als den Wert für die Spalte bereitzustellen.

Hier ist die gesamte Abfrage mit Beispieltempeltabellen deklariert und für die Verwendung innerhalb es gefüllt (ich hoffe, ich mache das richtig);

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

Die Form der zweiten Abfrage ist richtig, es ist nur, dass es die SUM s, anstatt die AVG s zu bieten scheint.

Ich brauche nicht so sehr die Antwort, wie man es ausdrückte, "spoonfed" zu mir; nur ein Hinweis darauf, was ich falsch mache in der PIVOT Abfrage wäre hilfreich.

Lassen Sie mich im Voraus sagen, dass jede Hilfe sehr geschätzt werden würde. Danke!

+0

Eigentlich ist diese Änderung falsch. In der Gesundheitsbranche wird den Anbietern, die als PMPM bezeichnet werden, ein Wert zugewiesen; Pro Mitglied pro Monat. Es ist kein Wert für jedes Mitglied, sondern ein Mittel, um zu sehen, wie viel pro Mitglied für die gesamte Einrichtung ausgegeben wird. Also, wenn die Gesundheitskosten sagen, $ 200 für Oktober, und es gibt 50 aktive Mitglieder in diesem Monat, ist der PMPM $ 200/50 oder 4 $. Es ist nicht für jedes Mitglied aufgeführt, sondern nach Arzt, Einrichtung oder Krankenhaus gruppiert, unabhängig von der Entität, für die der Wert ermittelt wird. Erneut, was ich gepostet habe, könnte ich diesen Teil besser formuliert haben. – AdamQuark

Antwort

0

Bearbeiten: um Ergebnismenge als Mittel für Anspruch Durchschnitt/Anzahl der Mitglieder innerhalb des Monats bereitzustellen.

Was für ein doozy! Wenn ich richtig verstehe, denke ich, dass das Folgende Ihnen helfen sollte. Es gibt das gesamte Jahresraster aus, unabhängig davon, ob im Monat ein Anspruch erhoben wurde.

Beachten Sie, dass ich den dynamischen sql-Teil entfernt habe, da ich diesen Teil für Sie belasse, um zu interpretieren, wie die geschachtelten Ergebnisse als Eingabe genutzt werden. Ich habe auch hart codiert in einem bestimmten Jahr Filter in der zweiten CTE, die trivialerweise mit einer variablen und/oder aus komplexeren zu berücksichtigen Monat, Tag usw.

;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 

ich den Schlüssel glaube ersetzt werden könnten Take Away ist die PIVOT Nutzung AVG() für alle Monate im Jahr.Um dynamisch zu filtern, können Sie die Pivot-Abfrage in ein CTE kapseln (oder die Ergebnisse in einer temporären Tabelle speichern) und dynamic sql verwenden, um die gesuchten Spalten (Monate) zu erfassen.

+0

Danke für die Post, pim, ich fummle jetzt damit. Ihr Code gibt eine separate Zeile für jedes Mitglied, aber ich suche nur die Gesamtkosten für jeden Monat/die Anzahl der aktiven Mitglieder in diesem Monat. Ich habe den Code geändert, um nur die eine Zeile zurückzugeben, aber ich bin nicht sicher, wie es seine Werte erhält. Daran arbeite ich noch. Ich poste die Art, wie ich es geändert habe, aber das scheint keine Option im Kommentarfeld zu sein. Nochmals danke, ich werde mich anschließen! – AdamQuark

+0

@AdamQuark Ich werde meine Antwort aktualisieren. Bleib 'dabei. – pimbrouwers

+0

@AdamQuark Ich habe meine Antwort aktualisiert, die eine dritte cte und eine Änderung der Gruppe von der zweiten cte enthält. Ich denke, das entspricht näherungsweise dem, wonach Sie suchen. – pimbrouwers

0

Ich habe eine Version, die funktioniert, wie ich will. Hier ist der endgültige Code für einen Beispieldatensatz festgelegt.

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