2

私は処分のカウントを行い、今月のものだけをカウントしたいと思っています。これが私が持っているコードです:

SELECT        Disposition, COUNT(Disposition) AS Count, Date
FROM            CSLogs.dbo.Logs
GROUP BY Disposition, Date
HAVING        (DATEPART(month, GETDATE()) = DATEPART(month, Date)) AND (DATEPART(year, GETDATE()) = DATEPART(year, Date))

しかし、私が得た結果は次のとおりです。

Disposition Count   Date
LOC         1       2012-12-10
Save        3       2012-12-11
LOC         1       2012-12-12
Sale        1       2012-12-12
Save        3       2012-12-12

ご覧のとおり、重複がありますが、それを探していません。たとえば、LOCは、カウントの下で2であり、日付列が表示されていません。

うまくいけば、私は事前に十分な情報と感謝を与えました!

4

1 に答える 1

3
DECLARE @FirstDayOfMonth datetime, @LastDayOfMonth datetime
--You can create scalar functions dbo.GetFirstDayOfMonth and dbo.GetLastDayOfMonth
-- try this from December 2012
SELECT @FirstDayOfMonth = '20121201', @LastDayOfMonth = '20121231'

    SELECT Disposition, COUNT(Disposition) AS Count
    FROM CSLogs.dbo.Logs
    WHERE Date BETWEEN @FirstDayOfMonth AND @LastDayOfMonth
    GROUP BY Disposition 

これはより効率的です。エンジンは、存在する場合、日付のインデックスを使用できます。

編集

このトリックを明確にしたいと思います。これは、日付指向のDBで常に必要とされるヘルパー関数です。

IF(OBJECT_ID('dbo.ufn_FisrtDayOfMonth') IS NOT NULL)
    DROP FUNCTION dbo.ufn_FisrtDayOfMonth
GO
CREATE FUNCTION dbo.ufn_FisrtDayOfMonth(@DATE DATE)
RETURNS DATETIME
BEGIN
    RETURN CAST(DATEADD(d, - DATEPART(d, @DATE) + 1, @DATE) as DATETIME)
END
GO

IF(OBJECT_ID('dbo.ufn_FisrtDayOfNextMonth') IS NOT NULL)
    DROP FUNCTION dbo.ufn_FisrtDayOfNextMonth
GO
CREATE FUNCTION dbo.ufn_FisrtDayOfNextMonth(@DATE DATE)
RETURNS DATETIME
BEGIN
    RETURN CAST(DATEADD(d, - DATEPART(d, @DATE) + 1, DATEADD(m, 1, @DATE)) as DATETIME)
END
GO

今、あなたはこれを試すことができます:

DECLARE @FirstDayOfMonth datetime, @FirstDayOfNextMonth datetime
SELECT @FirstDayOfMonth = dbo.ufn_FisrtDayOfMonth(GETDATE()), @FirstDayOfNextMonth = dbo.ufn_FisrtDayOfNextMonth(GETDATE())

    SELECT Disposition, COUNT(Disposition) AS Count
    FROM CSLogs.dbo.Logs
    WHERE Date >= @FirstDayOfMonth
      AND Date < @FirstDayOfNextMonth
    GROUP BY Disposition 
于 2012-12-13T14:20:44.983 に答える