2017-06-20 8 views
-1
Declare procursor CURSOR FOR 
SELECT CLAIMNO from RPT_CLAIM_MD_COMBO 
DECLARE @myyear Integer 
Declare @provar varchar(22) 

open procursor 

fetch next from procursor into @provar 

WHILE(@@FETCH_STATUS = 0) 
BEGIN 
SET @myyear = (SELECT 
CASE 
WHEN CONVERT(INTEGER,BTHDAT) = 0 THEN 0 //if the birthdate is 0 
WHEN datepart(DY,convert(date, BTHDAT)) > datepart(DY,'2015/07/01') THEN DATEDIFF(YEAR, convert(date, BTHDAT),'2015/07/01') - 1 //DY of a persons date is greater than 2015/01/01 then subtract the year by one 
ELSE DATEDIFF(YEAR,convert(date, BTHDAT),'2015/07/01') 
END 
from RPT_CLAIM_MD_COMBO WHERE CLAIMNO = @provar) 


SELECT SERVICE_GROUP, SERVICE_CATEGORY, 
CASE 
WHEN @myyear - 2015 <= 0 AND @myyear - 2015 >= 5 THEN 'Early Child' 
WHEN @myyear - 2015 <= 6 AND @myyear - 2015 >= 12 THEN 'Child' 
WHEN @myyear - 2015 <= 13 AND @myyear - 2015 >= 17 THEN 'Adolescent' 
WHEN @myyear - 2015 <= 18 AND @myyear - 2015 >= 21 THEN 'Transitional' 
WHEN @myyear - 2015 <= 22 AND @myyear - 2015 >= 64 THEN 'Adult' 
WHEN @myyear - 2015 >= 65 THEN 'Geriatric' 
ELSE '0' 
END AS Age_desc, 
SUM(CONVERT(MONEY, TOPAY)) AS PAID_AMT  
FROM RPT_CLAIM_MD_COMBO 
WHERE SERVICE_FY = '2016' and DISTYP = 'P' AND CLAIMNO = @provar 
GROUP BY 
SERVICE_GROUP,SERVICE_CATEGORY, 
CASE 
WHEN @myyear - 2015 <= 0 AND @myyear - 2015 >= 5 THEN 'Early Child' 
WHEN @myyear - 2015 <= 6 AND @myyear - 2015 >= 12 THEN 'Child' 
WHEN @myyear - 2015 <= 13 AND @myyear - 2015 >= 17 THEN 'Adolescent' 
WHEN @myyear - 2015 <= 18 AND @myyear - 2015 >= 21 THEN 'Transitional' 
WHEN @myyear - 2015 <= 22 AND @myyear - 2015 >= 64 THEN 'Adult' 
WHEN @myyear - 2015 >= 65 THEN 'Geriatric' 
ELSE '0' 
END 

fetch next from procursor into @provar 

END 

CLOSE procursor 

これは私のコードです。これを実行すると、次のエラーが発生します。 メッセージ329、レベル16、状態1、行21 各GROUP BY式には、少なくとも1つの列参照が含まれている必要があります。メッセージ329、レベル16、状態1、行21各GROUP BY式には少なくとも1つの列参照が含まれている必要があります

また、MS SQLサーバーで%rowtypeを使用することもできます。 は、誰かが

+2

だから[adkedこの質問](https://stackoverflow.com/questions/44655470/ms-sql-server-assigning-a-date-to-a-variable)と何も言いませんでした新しいエラーが発生しました。そのポストの最初の質問を詳しく説明すると、そのカーソルが最後に割り当てを解除する必要があります。そして// SSMS/SQL Serverで何かコメントアウトする方法ではなく、%rowtypeはORACLEです - row_number()は似ていますが、あまりにも曖昧です。 – scsimon

+0

@scsimonなぜですか?新しいSOの投稿を作成してユーザーに推測させるのは簡単です。それは20の質問をするようなものです! –

+1

ここでカーソルを使用していますか?ここに固定される必要があるので、多くのことが起こっています.... –

答えて

0

あなたの問題を表現BY

各グループが少なくとも1つの列の参照を含んでいなければならない...ということで、私を助けてくださいことができます。 GROUP BY

CASE文は、任意の列を参照していません。代わりに変数(@myyear)を使用しています。その理由は、値がすべてのレコードで同じになるため、GROUP BYのために何もせず、したがってあなたが間違っているとみなします。SQL

あなたの質問にはたくさんのことがありますので、実際に何をしようとしているのかは分かりません。それぞれSERVICE_GROUPSERVICE_CATEGORYAge_descの合計をPAID_AMTにすると思われます。

開始する変数@myyearSELECTステートメントの列に置き換えます。その値を計算するときに何をしようとしているのかよくわからないので、私の例ではただDATEPART(yyyy, ..)を使用します。あなたは簡単にこれをあなたの計算に置き換えることができます。だから、次のようになります。..

SELECT 
    SERVICE_GROUP, 
    SERVICE_CATEGORY, 
    BirthYear = DATEPART(yyyy, BTHDAT), 
    TOPAY 
FROM RPT_CLAIM_MD_COMBO 

これは、サブクエリまたはCTEのいずれかから新しいクエリで選択することができますが、きれいに異なる記述を取得します。コンパレータを反転したことに注目してください。 value <= 0 AND value >= 5の代わりにvalue >= 0 AND value <= 5があり、ELSE '0'の代わりに>= 65という年齢のためにelseケースを置きました。

;WITH Claims AS (
    SELECT 
     SERVICE_GROUP, 
     SERVICE_CATEGORY, 
     BirthYear = DATEPART(yyyy, BTHDAT) 
    FROM RPT_CLAIM_MD_COMBO 
) 

SELECT 
    SERVICE_GROUP, 
    SERVICE_CATEGORY, 
    Age_Desc = CASE 
     WHEN BirthYear - 2015 >= 0 AND BirthYear - 2015 <= 5 THEN 'Early Child' 
     WHEN BirthYear - 2015 >= 6 AND BirthYear - 2015 <= 12 THEN 'Child' 
     WHEN BirthYear - 2015 >= 13 AND BirthYear - 2015 <= 17 THEN 'Adolescent' 
     WHEN BirthYear - 2015 >= 18 AND BirthYear - 2015 <= 21 THEN 'Transitional' 
     WHEN BirthYear - 2015 >= 22 AND BirthYear - 2015 <= 64 THEN 'Adult' 
     ELSE 'Senior' END, 
    TOPAY 
FROM Claims 

今やるために残されているすべてのGROUPSUMです。もう一度これはサブクエリまたはCTEを使用して行うことができます。

;WITH Claims AS (
    SELECT 
     SERVICE_GROUP, 
     SERVICE_CATEGORY, 
     BirthYear = DATEPART(yyyy, BTHDAT) 
    FROM RPT_CLAIM_MD_COMBO 
), 
Claims_Categories AS (
    SELECT 
     SERVICE_GROUP, 
     SERVICE_CATEGORY, 
     Age_Desc = CASE 
      WHEN BirthYear - 2015 >= 0 AND BirthYear - 2015 <= 5 THEN 'Early Child' 
      WHEN BirthYear - 2015 >= 6 AND BirthYear - 2015 <= 12 THEN 'Child' 
      WHEN BirthYear - 2015 >= 13 AND BirthYear - 2015 <= 17 THEN 'Adolescent' 
      WHEN BirthYear - 2015 >= 18 AND BirthYear - 2015 <= 21 THEN 'Transitional' 
      WHEN BirthYear - 2015 >= 22 AND BirthYear - 2015 <= 64 THEN 'Adult' 
      ELSE 'Senior' END, 
     TOPAY 
    FROM Claims 
) 

SELECT 
    SERVICE_GROUP, 
    SERVICE_CATEGORY, 
    Age_Desc, 
    SUM(CONVERT(MONEY, TOPAY)) 
FROM Claims_Categories 
GROUP BY SERVICE_GROUP, SERVICE_CATEGORY, AGE_DESC 

これだけです。カーソルは必要ありません。私がやる最後の改善の1つは、ハードコードされた2015を取り除き、代わりに変数を使うことです。この例では、現在の年を使用するだけですが、ユースケースに応じて、ストアドプロシージャのパラメータとして渡すこともできます。

DECLARE @CurrentYear INT = DATEPART(yyyy, GETUTCDATE()) 

次に、あなただけの@CurrentYearの代わり2015を使用しています。

DECLARE @CurrentYear INT = DATEPART(yyyy, GETUTCDATE()) 

;WITH Claims AS (
    SELECT 
     SERVICE_GROUP, 
     SERVICE_CATEGORY, 
     BirthYear = DATEPART(yyyy, BTHDAT) 
    FROM RPT_CLAIM_MD_COMBO 
), 
Claims_Categories AS (
    SELECT 
     SERVICE_GROUP, 
     SERVICE_CATEGORY, 
     Age_Desc = CASE 
      WHEN BirthYear - @CurrentYear >= 0 AND BirthYear - @CurrentYear <= 5 THEN 'Early Child' 
      WHEN BirthYear - @CurrentYear >= 6 AND BirthYear - @CurrentYear <= 12 THEN 'Child' 
      WHEN BirthYear - @CurrentYear >= 13 AND BirthYear - @CurrentYear <= 17 THEN 'Adolescent' 
      WHEN BirthYear - @CurrentYear >= 18 AND BirthYear - @CurrentYear <= 21 THEN 'Transitional' 
      WHEN BirthYear - @CurrentYear >= 22 AND BirthYear - @CurrentYear <= 64 THEN 'Adult' 
      ELSE 'Senior' END, 
     TOPAY 
    FROM Claims 
) 

SELECT 
    SERVICE_GROUP, 
    SERVICE_CATEGORY, 
    Age_Desc, 
    SUM(CONVERT(MONEY, TOPAY)) 
FROM Claims_Categories 
GROUP BY SERVICE_GROUP, SERVICE_CATEGORY, AGE_DESC 
関連する問題