1

次の機能があり、パーツを取り出してSELECT別のビューを作成する必要があります。

CREATE FUNCTION dbo.dbf_get_penalty_points
(      @pn_seq_party_id          NUMERIC(18),
       @pv_penalty_points_code   CHAR(1) = 'Y') -- Use 'N' for total points, otherwise will return Current Penalty Points

RETURNS NUMERIC(18,0)
AS
BEGIN
   DECLARE @n_penalty_points       NUMERIC(18),
           @d_latest_points_date   DATETIME

   SELECT @d_latest_points_date = dbo.dbf_trunc_date(DateAdd(mm, - Abs(Convert(NUMERIC(18,0),dbo.dbf_get_sys_param('CMS2', 'PP_MONTHS'))), GetDate()))

   SELECT @n_penalty_points = IsNull(Sum(penalty_points_amount),0)
     FROM dbo.ar_penalty_point WITH(NOLOCK) 
    WHERE seq_party_id = @pn_seq_party_id
      AND 1 = CASE
                 WHEN @pv_penalty_points_code = 'N' THEN 1
                 WHEN @pv_penalty_points_code = 'Y' AND added_date >= @d_latest_points_date AND reset_date IS NULL THEN 1
                 ELSE 0
              END

   RETURN @n_penalty_points
END

GO

SET QUOTED_IDENTIFIER OFF
GO

GRANT EXECUTE ON dbo.dbf_get_penalty_points TO standard
GO

私は試してみて、これを手に入れました、

 SELECT SUM(CASE WHEN added_date >=dbo.dbf_trunc_date(DateAdd(mm, - Abs(Convert(NUMERIC(18,0),dbo.dbf_get_sys_param('CMS2', 'PP_MONTHS'))), GetDate()))
                    AND reset_date IS NULL THEN 1 
                    ELSE 0) current_points,
           IsNull(Sum(penalty_points_amount),0) total_points,
           seq_party_id
     FROM dbo.ar_penalty_point WITH(NOLOCK) 
          GROUP BY seq_party_id

今、私は取り除く必要があります

dbo.dbf_trunc_date(DateAdd(mm, - Abs(Convert(NUMERIC(18,0),dbo.dbf_get_sys_param('CMS2', 'PP_MONTHS'))), GetDate()))

SELECTクエリの部分から。私の意見を書くためのより良い方法はありますか?

EDIT
目的は、total_points と current_points を返すビューを作成することです。理解を深めるために、CREATE次の部分を参照してください

CREATE FUNCTION dbo.dbf_get_penalty_points
(      @pn_seq_party_id          NUMERIC(18),
       @pv_penalty_points_code   CHAR(1) = 'Y') -- Use 'N' for total points, otherwise will return Current Penalty Points

参照-- 合計ポイントには「N」を使用します。それ以外の場合は、コメントに現在のペナルティ ポイントが返されます

4

1 に答える 1

0

これが私が思いついたものです

SELECT SUM(CASE WHEN (t.added_date >= t.target_date
                AND t.reset_date IS NULL) THEN 1 
                ELSE 0 END) current_points,
       IsNull(Sum(t.penalty_points_amount),0) total_points,
       t.seq_party_id
 FROM (
   SELECT dbo.dbf_trunc_date(DateAdd(mm, - Abs(Convert(NUMERIC(18,0),dbo.dbf_get_sys_param('CMS2', 'PP_MONTHS'))), GetDate())) as target_date,
        u.reset_date, u.penalty_points_amount,u.seq_party_id,u.added_date  FROM
dbo.ar_penalty_point as u ) as t GROUP BY  t.seq_party_id
于 2013-09-09T11:06:36.530 に答える