如何计算整个表中符合特定条件的行数?

时间:2019-08-28 11:37:03

标签: sql group-by

我正在尝试创建一个表格,该表格将告诉我datecreated的表格,该表格将告诉我每个日期和名称,当天该名称被“主动”分配了多少个项目。 datedeleted以及分配给它的人的名字。在给定的一天中对此进行计数的方法是查看该天之前创建的所有项目,并对在该天之前未删除的项目进行计数。

例如,有人在8月21日分配了一个商品,然后在8月24日将其删除。所以对于21日,22日和23日,我希望这种情况能够得到“积极分配”

我创建了一个小的查询,该查询将只需要一天就可以找到它,但是理想情况下,我希望能够在数据库中的所有日期都看到它。我无法弄清楚如何用“ 20190825”代替表中的每个DateCreated

SELECT Name, MAX(CAST(DateCreated as date)) DateCreated, COUNT(itemid) Number_Assigned 
  FROM dbo.Items
 WHERE CAST(DateCreated as date) <= '20190825' 
   AND (DateDeleted > '20190825' OR DateDeleted IS NULL)
 GROUP BY Name

我应该有三列NameDateCreatedNumber_Assigned,其中分配的数字告诉我当天的“活动”项目数。

1 个答案:

答案 0 :(得分:0)

通过使用派生表列出日期,可以将查询扩展到更多天。然后使用CROSS JOIN生成行,并使用LEFT JOINitems引入数据:

SELECT n.Name, v.dte, COUNT(i.itemid) as Number_Assigned
FROM (VALUES (CONVERT(date, '20190822')),
             (CONVERT(date, '20190823')),
             (CONVERT(date, '20190824')),
             (CONVERT(date, '20190825'))
     ) d(dte) CROSS JOIN
     (SELECT DISTINCT name FROM items
     ) n LEFT JOIN
     dbo.Items
     ON i.DateCreated <= d.dte AND
        (i.DateDeleted > d.dte OR i.DateDeleted IS NULL)
GROUP BY n.Name, d.dte
ORDER BY n.Name, d.dte;