1

いくつかの日付を含むサンプル ビューがあります。月ごとに開封されたアイテムの数をどのように見つけますか. OpenDate と CloseDate が開いていた時間と閉じていた時間の間に言って、1 月、2 月などの各月に何人が開いていたかを調べたいと思います。

10月 4アイテム開封。

これは、データを含むサンプルテーブルです

CREATE TABLE [dbo].[TestDate](
    [ItemTitle] [nvarchar](50) NULL,
    [ItemAttachAssignDate] [date] NULL,
    [ItemDetachConcludeDate] [date] NULL,
    [Status] [nvarchar](50) NULL,
    [FullName] [nvarchar](100) NULL,
    [OpenDate] [date] NULL,
    [CloseDate] [date] NULL
) ON [PRIMARY]

GO


INSERT INTO [TestDate]([ItemAttachAssignDate], [ItemDetachConcludeDate], [Status], [FullName], [OpenDate], [CloseDate]) 
    VALUES('2013-02-18 00:00:00', '2013-02-19 00:00:00', 'Done', 'Jeff Hunter      ', '2013-02-18 00:00:00', '2013-02-19 00:00:00');

INSERT INTO [TestDate]([ItemAttachAssignDate], [ItemDetachConcludeDate], [Status], [FullName], [OpenDate], [CloseDate]) 
    VALUES('2012-10-15 00:00:00', '2013-02-05 00:00:00', 'Done', 'Tommy Johnson', '2013-01-22 00:00:00', '2013-01-28 00:00:00');

INSERT INTO [TestDate]([ItemAttachAssignDate], [ItemDetachConcludeDate], [Status], [FullName], [OpenDate], [CloseDate]) 
    VALUES('2012-10-15 00:00:00', '2013-02-05 00:00:00', 'Done', 'Jeff Haynes', '2012-10-17 00:00:00', '2013-02-01 00:00:00');

INSERT INTO [TestDate]([ItemAttachAssignDate], [ItemDetachConcludeDate], [Status], [FullName], [OpenDate], [CloseDate]) 
    VALUES('2012-10-15 00:00:00', '2013-02-05 00:00:00', 'Done', 'Nancy Belkin', '2012-10-28 00:00:00', '2012-12-14 00:00:00');

INSERT INTO [TestDate]([ItemAttachAssignDate], [ItemDetachConcludeDate], [Status], [FullName], [OpenDate], [CloseDate]) 
    VALUES('2012-10-15 00:00:00', '2013-02-05 00:00:00', 'Done', 'Rudolph Porche', '2013-01-16 00:00:00', '2013-02-02 00:00:00');

INSERT INTO [TestDate]([ItemAttachAssignDate], [ItemDetachConcludeDate], [Status], [FullName], [OpenDate], [CloseDate]) 
    VALUES('2012-10-20 00:00:00', '2013-02-07 00:00:00', 'Done', 'Pat Franks', '2013-01-20 00:00:00', '2013-01-25 00:00:00');

INSERT INTO [TestDate]([ItemAttachAssignDate], [ItemDetachConcludeDate], [Status], [FullName], [OpenDate], [CloseDate]) 
    VALUES('2012-10-20 00:00:00', '2013-02-07 00:00:00', 'Done', 'Leslie Jordan', '2012-11-25 00:00:00', '2012-12-04 00:00:00');

INSERT INTO [TestDate]([ItemAttachAssignDate], [ItemDetachConcludeDate], [Status], [FullName], [OpenDate], [CloseDate]) 
    VALUES('2012-10-20 00:00:00', '2013-02-07 00:00:00', 'Done', 'Fred Haney', '2012-10-20 00:00:00', '2013-02-04 00:00:00');

INSERT INTO [TestDate]([ItemAttachAssignDate], [ItemDetachConcludeDate], [Status], [FullName], [OpenDate], [CloseDate]) 
    VALUES('2012-10-20 00:00:00', '2013-02-07 00:00:00', 'Done', 'Henry Hanks', '2012-10-31 00:00:00', '2012-11-15 00:00:00');
4

3 に答える 3

1

あなたの質問のこの部分がわかりません:

OpenDate と CloseDate の間で言う

それは、ある種の日付計算または比較を行う必要があるということですか?

ただし、月ごとの集計を探しているだけの場合は、これを処理する方法がいくつかあります。日から月へのマッピングを含む日付参照またはディメンション テーブルを結合することができます。または、日付の関連部分を単純に削除することもできます。つまり、

SELECT DATEPART(YEAR, OpenDate) AS OpenYear
    , DATEPART(MONTH, OpenDate) AS OpenMonth
    , COUNT(*) AS OpenCount
FROM dbo.TestDate
GROUP BY DATEPART(YEAR, OpenDate)
    , DATEPART(MONTH, OpenDate);

カウントを月の最初の日にロールアップすることもできます。つまり、

SELECT CONVERT(VARCHAR(10),DATEADD(MONTH, DATEDIFF(MONTH,0,OpenDate),0),120) AS OpenMonth
    , COUNT(*) AS OpenCount
FROM dbo.TestDate
GROUP BY CONVERT(VARCHAR(10),DATEADD(MONTH, DATEDIFF(MONTH,0,OpenDate),0),120);

それは、データを使って何をしているのか、そしてそれをどのように提示する必要があるのか​​ によって異なります. HTH。

于 2013-03-11T17:56:25.043 に答える
0

あなたが本当に知りたいのは、「各月のアクティブなステータスのアイテムの数」であると思います。たとえば、1 つのアイテムの opendate が 2012 年 11 月 15 日で、closedate が 2013 年 1 月 2 日である場合、このアイテムを 3 か月間開いていると見なし、毎月、このアイテムのため、開いているアイテム数は +1 になるはずです。

もしそうなら、次のスクリプトが役に立ちます。これは簡単なロジックです。これを置き換えるには、より適切なコードが必要です。

select YearMonth, SUM(OpenItemCount)
from (
select cast(DATEPART(YYYY,CloseDate) as varchar(4)) + CAST(DATEPART(mm,CloseDate) as varchar(2)) as YearMonth, 
       COUNT(*) as OpenItemCount 
from  [dbo].[TestDate]
group by cast(DATEPART(YYYY,CloseDate) as varchar(4)) + CAST(DATEPART(mm,CloseDate) as varchar(2))    
union all    
select cast(DATEPART(YYYY,OpenDate) as varchar(4)) + CAST(DATEPART(mm,OpenDate) as varchar(2)) as YearMonth, 
       COUNT(*) as OpenItemCount 
from  [dbo].[TestDate]
where (cast(DATEPART(YYYY,OpenDate) as varchar(4)) + CAST(DATEPART(mm,OpenDate) as varchar(2))) <> (cast(DATEPART(YYYY,CloseDate) as varchar(4)) + CAST(DATEPART(mm,CloseDate) as varchar(2)))
group by cast(DATEPART(YYYY,OpenDate) as varchar(4)) + CAST(DATEPART(mm,OpenDate) as varchar(2))    
) as A
group by A.YearMonth
于 2013-03-11T18:25:46.360 に答える