0

会計年度の月をループし、各月のアイテムをカウントするストアド プロシージャがあります。176 個のアイテムがあることはわかっていますが、これを実行すると合計 182 が返されます。@EndDate から 1 秒を削除しようとしましたが、合計カウントは 165 でした。つまり、アイテムを 2 回カウントするか、またはそれらすべてを数えていません。ここで私が間違っていることを誰かが助けることができますか? 以下は、私がやっていることの簡略化されたバージョンです:

DECLARE @Date DATETIME
DECLARE @EndDate DATETIME

SELECT @Date = CAST((@Year - 1) as VARCHAR) + '-07-01'
SELECT @EndDate = DATEADD(Month, 1, @Date)


DECLARE @Count INT
SELECT @Count = 0
WHILE @Count < 12

BEGIN

    SELECT 
        COUNT(yai.ID)
    FROM
        table_1    yai 
        INNER JOIN table_2 yat ON yai.ID = yat.ID 
    WHERE
        (yat.Date_Received BETWEEN CONVERT(VARCHAR, @Date, 101) AND CONVERT(VARCHAR, @EndDate, 101))  AND 
        yai.Pro_Type = @Value AND yat.Type = 'PC'

    SELECT @Count = @Count + 1
    SELECT @Date = DATEADD(MONTH, 1, @Date)
    SELECT @EndDate = DATEADD(MONTH, 1, @EndDate)

END
4

7 に答える 7

1

その間は包括的であるため、1 秒の減算はそこにあるはずです (または 1 日)。私の推測では、いくつかのヤイには対応するヤットがありません。

編集: あなたのコードは偽物です。フォーマット 101 では等価以外の比較はできません。

于 2009-09-22T17:54:25.017 に答える
0

頭のてっぺんから。

SELECT DATEPART(month, yat.Date) as month, COUNT(yai.ID)
FROM table_1 yai 
INNER JOIN table_2 yat ON yai.ID = yat.ID 
WHERE
    yai.Pro_Type = @Value AND yat.Type = 'PC' 
    AND DATEPART(year, yat.Date)=@Year
GROUP BY DATEPART(month, yat.Date)
ORDER BY DATEPART(month, yat.Date)
于 2009-09-22T17:56:25.763 に答える
0

私は50個のアイテムがあり、SQLが60を返したという事実を知っているような面白いことを言っていました...

私はいつも間違っていたことに気づきました!:)

日付と時刻のフィールドから時刻を削除してみてください。

DATEADD(d, DATEDIFF(d, 0, GetDate()), 0)

于 2009-09-22T17:56:32.917 に答える
0

代わりにこれをできませんでしたか?次のクエリは、月ごとにグループ化されたカウントを提供します。これをビューに配置すると、ビューから選択し、where 句を使用して関心のある年と月でフィルター処理できます。

select year(yat.Date_Received) as year, month(yat.Date_Received) as month, count(*) as count
    count(yai.ID)
from table_1 yai 
inner join table_2 yat on yai.ID = yat.ID 
where yai.Pro_Type = 'some_value' 
    and yat.Type = 'PC'
group by year(yat.Date_Received), month(yat.Date_Received)
于 2009-09-22T17:57:21.557 に答える
0

これは不要なループが SQL コードである典型的なケースですが、これをループで解決したい場合は、ループ内の選択を次のように変更します。

 SELECT 
        COUNT(yai.ID)

に:

 SELECT 
     @Date,@EndDate,*

次に、出力を見て、返された行を確認します

于 2009-09-22T17:59:30.647 に答える
0

次のように、暦月を絶対整数参照に変換してみませんか。

DECLARE @BeginDate datetime = '7/1/2008'
DECLARE @EndDate datetime = '6/30/2009'
--
-- Convert calendar months into an absoulte integer:
--
DECLARE @BeginMonth int = (DatePart(year, @BeginDate) * 12) + DatePart(month, @BeginDate)
DECLARE @EndMonth int = (DatePart(year, @EndDate) * 12) + DatePart(month, @EndDate)

SELECT COUNT(yai.ID)
FROM table_1 yai
INNER JOIN table_2 yat ON yai.ID = yat.ID
WHERE (DatePart(year, yat.Date_Received) * 12) + DatePart(month, yat.Date_Received) 
    BETWEEN @BeginMonth AND @EndMonth)
AND yai.Pro_Type = @Value
AND yat.Type = 'PC'
于 2009-09-22T18:05:32.437 に答える