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