2013-10-02 65 views
3

我想開發一個查詢來確定一個人在一個季度中每天都有的藥物量。在某些日子裏,沒有規定藥物,對於其他人,可能會有重疊,我需要一個總量(意思是每天總結的力量)。藥物的數量,優勢,供應日期等可能會有所不同。這裏有一些數據:創建日期表與處方每季度的金額

create table #MemberInfo 
(ProgramName varchar(255), 
DateFilled datetime, 
DaySupply integer, 
MemberID varchar(255), 
Strength integer, 
Tradename varchar(255)); 

insert into #MemberInfo 
Values ('InsureCo', '20130612', 30, 'MEM001', 10, 'Sedative') 
, ('InsureCo', '20130429', 30, 'MEM001', 20, 'Sedative') 
, ('InsureCo', '20130401', 30, 'MEM001', 20, 'Sedative') 
, ('InsureCo', '20130529', 30, 'MEM001', 30, 'Sedative') 

我真的不知道什麼是最好的辦法可能是添加了一個季度,在給定的一天服用藥量。如果可以,我想避免使用遊標。我正在考慮創建一個所有日子的臨時表,然後以某種方式將這些日期加入到每天服用藥物的日期中(即DateFilled +隨後的每一天直到DaySupply)。一旦我達到了每個季度的每種藥物的日期和金額,我就可以每天進行分組,並獲得每天的強度總和。我還需要能夠獲得超過四分之一的平均金額。

附加要求:

  1. 我有一個開始日期和天數。我想爲每位成員每天爲他們開一張處方創建一行 (並且爲他們的所有處方做相同的 )。然後我會總結每天所有藥物的強度 。如果有幫助的話,所有的藥物將會是同一類藥物,並且劑量將相當於 劑量,這意味着我可以將它們總結起來。
  2. 對於報告,我需要能夠連續計算數量大於某個臨界值(比如說100)的天數。這就是爲什麼我是 試圖獲得每天的金額。

    Desired output 
    
    MemberID Date  SumStrength 
    MEM001  2013-04-29 40 
    MEM001  2013-04-30 40 
    MEM001  2013-05-01 20 
    ETC FOR EVERY DAY FOR THIS MEMBER 
    
    MEM002  2013-04-01 60 
    MEM002  2013-04-02 40 
    ETC FOR EVERY DAY FOR THIS MEMBER 
    
+2

這是一個很好的開始。現在所缺少的是您希望從示例數據中獲得的示例輸出,並努力實際檢索自己的輸出,我們可以嘗試幫助您找到答案。 –

+0

我添加了一些簡單的示例輸出到我原來的問題。提前致謝。這比我過去寫過的大多數問題都要多一點。 – MacGruber

+0

我已將'medical'標籤移除爲無關緊要。你的問題不是特別的醫療問題,因爲它只能用數量和日期。 –

回答

1

只是一個簡單的按我的想法。

create table #MemberInfo 
(ProgramName varchar(255), 
DateFilled datetime, 
DaySupply integer, 
MemberID varchar(255), 
Strength integer, 
Tradename varchar(255)); 

insert into #MemberInfo 
Values ('InsureCo', '20130612', 30, 'MEM001', 10, 'Sedative') 
, ('InsureCo', '20130429', 30, 'MEM001', 20, 'Sedative') 
, ('InsureCo', '20130429', 30, 'MEM002', 25, 'Sedative') 
, ('InsureCo', '20130515', 30, 'MEM002', 25, 'Sedative') 
, ('InsureCo', '20130401', 30, 'MEM001', 20, 'Sedative') 
, ('InsureCo', '20130529', 30, 'MEM001', 30, 'Sedative') 
, ('InsureCo', '20130529', 30, 'MEM003', 35, 'Sedative') 
, ('InsureCo', '20130529', 30, 'MEM003', 45, 'Sedative') 

select memberid,datefilled,SUM(strength) as [Strength sum] 
from #MemberInfo 
where memberid = 'MEM003' -- or whatever, could be a parameter 
group by memberid,DateFilled 

order by Memberid,DateFilled 

drop table #MemberInfo 
+0

我的問題是,我沒有每天都有藥物被填滿。我有一個開始日期和幾天。我想爲每個成員每天都開一張處方(併爲他們的所有處方做相同的處理)。然後我會總結每天所有藥物的強度。如果它有幫助,所有的藥物將是同一類,並且力量將是等效的劑量,這意味着我可以總結它們。 – MacGruber

+2

@ KennyG:你不斷增加人們給你的每個答案的要求。而不是這樣做,[編輯]你的問題,以便當他們嘗試發佈答案時,人們確切知道你的要求是什麼**。我們無法擊中移動目標。 –

+0

@ KennyG:......當我們無法預測它的下一步行動時。 –

1

這裏是它如何做建設使用CTE日曆和使用OVER(PARTION BY)

查詢做骨料的例子:

-- Declare a Start and End Date required to build a calendar 
DECLARE @StartDate DATETIME = '2013-01-01' 
DECLARE @EndDate DATETIME = '2015-01-01' 

-- Build out a Day/Quarter Calendar 
;WITH Calendar ([Date], [Quarter]) AS (
    SELECT @StartDate, 1 
    UNION ALL 
    SELECT [Date] + 1, (DATEDIFF(m, @StartDate, [Date] + 1)/3) + 1 
    FROM Calendar 
    WHERE [Date] + 1 < @EndDate 
) 

-- Build Result Set 
SELECT ProgramName, 
     DateFilled, 
     DaySupply, 
     MemberID, 
     Strength, 
     Quarter, 
     SUM(Strength) OVER(PARTITION BY ProgramName, DaySupply, MemberID, Quarter) AS QuarterlyTotal, 
     AVG(Strength) OVER(PARTITION BY ProgramName, DaySupply, MemberID, Quarter) AS QuarterlyAverage 
FROM #MemberInfo MI 
JOIN Calendar C ON MI.DateFilled = C.[Date] 
ORDER BY MemberID, DateFilled 
OPTION (MAXRECURSION 0) 

測試數據:

create table #MemberInfo 
(ProgramName varchar(255), 
DateFilled datetime, 
DaySupply integer, 
MemberID varchar(255), 
Strength integer, 
Tradename varchar(255)); 

INSERT INTO #MemberInfo 
Values 
    --MEM001 
    --Q1 
    ('InsureCo', '20130112', 30, 'MEM001', 10, 'Sedative') 
    ,('InsureCo', '20130129', 30, 'MEM001', 20, 'Sedative') 
    ,('InsureCo', '20130401', 30, 'MEM001', 20, 'Sedative') 
    --Q2 
    ,('InsureCo', '20130529', 30, 'MEM001', 30, 'Sedative') 
    ,('InsureCo', '20130429', 30, 'MEM001', 20, 'Sedative') 
    ,('InsureCo', '20130401', 30, 'MEM001', 20, 'Sedative') 
    --Q3 
    ,('InsureCo', '20130829', 30, 'MEM001', 30, 'Sedative') 

    --MEM002 
    --Q1 
    ,('InsureCo', '20130112', 30, 'MEM002', 10, 'Sedative') 
    ,('InsureCo', '20130129', 30, 'MEM002', 20, 'Sedative') 
    ,('InsureCo', '20130401', 30, 'MEM002', 20, 'Sedative') 
    --Q2 
    ,('InsureCo', '20130529', 30, 'MEM002', 30, 'Sedative') 
    ,('InsureCo', '20130429', 30, 'MEM002', 20, 'Sedative') 
    ,('InsureCo', '20130401', 30, 'MEM002', 20, 'Sedative') 
    --Q3 
    ,('InsureCo', '20130829', 30, 'MEM002', 30, 'Sedative') 
    --Q4 
    ,('InsureCo', '20131129', 30, 'MEM002', 30, 'Sedative') 

結果:

ProgramName DateFilled DaySupply MemberID Strength Quarter QuarterlyTotal QuarterlyAverage 
InsureCo 2013-01-12 30   MEM001  10   1  30    15 
InsureCo 2013-01-29 30   MEM001  20   1  30    15 
InsureCo 2013-04-01 30   MEM001  20   2  90    22 
InsureCo 2013-04-01 30   MEM001  20   2  90    22 
InsureCo 2013-04-29 30   MEM001  20   2  90    22 
InsureCo 2013-05-29 30   MEM001  30   2  90    22 
InsureCo 2013-08-29 30   MEM001  30   3  30    30 
InsureCo 2013-01-12 30   MEM002  10   1  30    15 
InsureCo 2013-01-29 30   MEM002  20   1  30    15 
InsureCo 2013-04-01 30   MEM002  20   2  90    22 
InsureCo 2013-04-01 30   MEM002  20   2  90    22 
InsureCo 2013-04-29 30   MEM002  20   2  90    22 
InsureCo 2013-05-29 30   MEM002  30   2  90    22 
InsureCo 2013-08-29 30   MEM002  30   3  30    30 
InsureCo 2013-11-29 30   MEM002  30   4  30    30 
+0

這適用於季度平均值。爲了進行報告,我需要能夠連續計算數量大於某個臨界值的天數(比方說100)。這就是爲什麼我想每天獲得金額。 – MacGruber

+0

@ KennyG:看到我的評論傑裏的答案:http://stackoverflow.com/questions/19145340/create-date-table-with-prescription-amount-for-every-day-in-a-quarter?noredirect=1 #comment28319084_19145940 –

0

我做了今晚周圍的一些演奏和我非常接近:

一些數據:

create TABLE dateranges (drug VARCHAR(5), date_begin DATETIME, numdays integer,strength  integer) 
INSERT into dateranges values ('DrugA', '2010-01-01', 5, 10); 
INSERT into dateranges values ('DrugB', '2008-02-27', 10, 20); 
INSERT into dateranges values ('DrugC', '2010-04-26', 3, 20); 
INSERT into dateranges values ('DrugD', '2000-02-01', 5, 30); 

的CTE :

WITH cte (id, d, s) 
    AS (SELECT tbl.drug AS id 
       ,tbl.date_begin AS d 
       ,tbl.strength AS s 
      FROM dateranges tbl 
      WHERE DATEDIFF(DAY, tbl.date_begin, tbl.date_begin+numdays-1) <= 100 
     UNION ALL 
     SELECT tbl.drug AS id 
       ,DATEADD(DAY, 1, cte.d) AS d 
       ,tbl.strength as s 
      FROM cte 
       INNER JOIN dateranges tbl 
        ON cte.id = tbl.drug 
      WHERE cte.d < tbl.date_begin+numdays-1) 
SELECT id AS drug 
     ,d AS dates 
     ,s AS strength 
    FROM cte 
ORDER BY id, d, s 

結果:

DRUG DATES STRENGTH 
DrugA January, 01 2010 00:00:00+0000 10 
DrugA January, 02 2010 00:00:00+0000 10 
DrugA January, 03 2010 00:00:00+0000 10 
DrugA January, 04 2010 00:00:00+0000 10 
DrugA January, 05 2010 00:00:00+0000 10 
DrugB February, 27 2008 00:00:00+0000 20 
DrugB February, 28 2008 00:00:00+0000 20 
DrugB February, 29 2008 00:00:00+0000 20 
DrugB March, 01 2008 00:00:00+0000 20 
DrugB March, 02 2008 00:00:00+0000 20 
DrugB March, 03 2008 00:00:00+0000 20 
DrugB March, 04 2008 00:00:00+0000 20 
DrugB March, 05 2008 00:00:00+0000 20 
DrugB March, 06 2008 00:00:00+0000 20 
DrugB March, 07 2008 00:00:00+0000 20 
DrugC April, 26 2010 00:00:00+0000 20 
DrugC April, 27 2010 00:00:00+0000 20 
DrugC April, 28 2010 00:00:00+0000 20 
DrugD February, 01 2000 00:00:00+0000 30 
DrugD February, 02 2000 00:00:00+0000 30 
DrugD February, 03 2000 00:00:00+0000 30 
DrugD February, 04 2000 00:00:00+0000 30 
DrugD February, 05 2000 00:00:00+0000 30 

從這裏,我通過藥物,日期,強度(強度相加)計劃分組。我應該能夠把這些結果扔到臨時表中,然後計算超過我提到的閾值的天數。