首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于事件名称更新对象计数的SQL查询

基于事件名称更新对象计数的SQL查询
EN

Stack Overflow用户
提问于 2016-03-17 04:09:25
回答 7查看 128关注 0票数 0

想象一下,我是许多书店的老板。我保存了一个数据库,记录了我所有书店里发生的所有事件。两个值得注意的事件是"Book Added“和"Book Removed",用于将书添加到故事的库存中,以及从商店出售时。示例模式可以是bookstore_idevent_name、` `time。

现在假设我有第二个表,它维护每个书店的当前状态,所以模式应该是bookstore_idnum_books

我希望能够使用第一个表来获得每个书店的所有“图书添加”事件的计数,减去每个书店的所有“图书删除”事件的计数,然后在第二个表中更新每个书店中的图书数量。

我能想到的唯一方法是使用游标,但我假设有一种更“SQL风格”的方法,它更基于集合,不需要游标。

EN

回答 7

Stack Overflow用户

发布于 2016-03-17 04:28:09

代码语言:javascript
复制
select bookstore_id
     , sum(case when event_name = "Book Removed" then -1 else 1 end) as "num books"
  from bookstores  
 group by bookstore_id 

如果超过2个事件

代码语言:javascript
复制
select bookstore_id
     , sum(case when event_name = "Book Removed" then -1 
                when event_name = "Book Added"   then  1  
           end) as "num books"
  from bookstores  
 group by bookstore_id 

除非您遇到性能问题,否则我只会将其作为视图

票数 1
EN

Stack Overflow用户

发布于 2016-03-17 04:32:11

您可以使用GROUP BY子句对事件进行计数。

如果我们创建两个子表,在那里我们分别计算添加的和删除的书,我们可以简单地减去结果并在父表中更新它们。这看起来像这样:

代码语言:javascript
复制
UPDATE      b
SET         b.numbooks = AddedBooks.BooksAdded - RemovedBooks.BooksRemoved
FROM        dbo.Books b
INNER JOIN  (SELECT     be.book_id, count(*) AS BooksAdded
            FROM        dbo.BookEvents be
            WHERE       be.event = 'BookAdded'
            GROUP BY    be.book_id, be.event) AS AddedBooks 
                                    ON b.bookid = AddedBooks.book_id
INNER JOIN  (SELECT     be.book_id, count(*) AS BooksRemoved
            FROM        dbo.BookEvents be
            WHERE       be.event = 'BookRemoved'
            GROUP BY    be.book_id, be.event) AS RemovedBooks  
                                    ON b.bookid = RemovedBooks.book_id
票数 1
EN

Stack Overflow用户

发布于 2016-03-17 04:27:43

我们可以使用CTE来单独获取细节并对其进行处理。

代码语言:javascript
复制
With CTE_Add AS
(
Select Bkstr_ID, Count(event_Name) As Added From temp Where event = 'Added' Group by Bkstr_ID
), CTE_Rem As
(
Select Bkstr_ID, Count(event_Name) As Removed From temp Where event = 'Removed'      Group by Bkstr_ID
)
Select A.Bkstr_ID,  Added - Removed
From CTE_Add A
Left Join CTE_Rem R On A.Bkstr_ID= R.Bkstr_ID

这将为您提供ID和计数。您可以使用Insert语句代替select语句

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36045956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档