首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server :计算记录可应用于表的次数

问Server :计算记录可应用于表的次数
EN

Stack Overflow用户
提问于 2018-07-10 08:43:59
回答 2查看 133关注 0票数 0

我有两张桌子,Tickets和Discount。我必须数一数折扣ID组合可应用于Ticket表中订单的次数:

Tickets表:

代码语言:javascript
复制
ITEMID | CATEGORYID
-------+-----------
     1 |         11
     1 |         11
     1 |         11
     2 |         11
     3 |         12
     4 |         13
     4 |         13
     5 |         14

Discounts表:

代码语言:javascript
复制
DiscountID | ITEMID | CATEGORYID
-----------+--------+-----------
         1 |      1 |         11
         1 |      4 |         13
         2 |      1 |         11
         2 |      6 |         15
         3 |      1 |         11
         3 |      5 |         14

结果: DiscountID 1可应用于Ticket表两次,DiscountID 3可应用一次。

我目前设法通过循环在存储过程,它是缓慢的,因为我必须循环每个折扣项目与所有门票项目手动。

我想知道是否有更好的方法通过JOIN和INTERSECT结合使用SQL。我无法理解这件事,我必须同时在折扣表中匹配1排以上。

更好的解释:

没有任何折扣的原始表格:Tickets表:

代码语言:javascript
复制
ITEMID | CATEGORYID
-------+-----------
     1 |         11
     1 |         11
     1 |         11
     2 |         11
     3 |         12
     4 |         13
     4 |         13
     5 |         14

应用折扣ID 1:

代码语言:javascript
复制
DiscountID | ITEMID | CATEGORYID
-----------+--------+-----------
         1 |      1 |         11
         1 |      4 |         13

折扣ID 1计算了两次,因为:

代码语言:javascript
复制
ITEMID | CATEGORYID
-------+-----------
     1 |         11
     1 |         11
     4 |         13
     4 |         13

现在进入折扣ID 2:

代码语言:javascript
复制
DiscountID | ITEMID | CATEGORYID
-----------+--------+-----------
         2 |      1 |         11
         2 |      6 |         15

删除计数的DiscountID 1项:

代码语言:javascript
复制
ITEMID | CATEGORYID
-------+-----------
     1 |         11
     2 |         11
     3 |         12
     5 |         14

折扣ID 2的计数为0,因为在票务表1\ 11中只能匹配一条双头ID 2的记录。

而

6\ 15在票表中不可用。由于折扣ID 2不匹配,票证表中没有删除任何内容

现在转到折扣ID 3:

DiscountID / ITEMID \x\x{e76f}\{e76f}\x{e76f}

代码语言:javascript
复制
         3 |      5 |         14


ITEMID | CATEGORYID
-------+-----------
     1 |         11
     2 |         11
     3 |         12
     5 |         14

一次计算折扣ID 3,现在删除计数记录

代码语言:javascript
复制
ITEMID | CATEGORYID
-------+-----------
     2 |         11
     3 |         12

由于我不知道如何通过SQL执行上面的操作,所以我不知道如何输出:

代码语言:javascript
复制
DISCOUNTID | APPLIED
-----------+-----------
     1     |   2
     3     |   1
EN

回答 2

Stack Overflow用户

发布于 2018-07-10 09:14:05

这就行了。

代码语言:javascript
复制
select distinct d.*
from discounts d
   inner join tickets t on t.itemId = d.itemid 
      and t.categoryId = d.categoryId

它会给你

代码语言:javascript
复制
DiscountID | ITEMID | CATEGORYID
-----------+--------+-----------
         1 |      1 |         11
         1 |      4 |         13
         2 |      1 |         11
         3 |      5 |         14

然后,您可以根据需要对所有列进行汇总。

select discountid, count(*) as apply_discount_x_times from ( select distinct d.discountid, d.itemId, d.categoryId from discounts d inner join tickets t on t.itemId = d.itemid and t.categoryId = d.categoryId ) x group by discountid

给你

DiscountID | apply_discount_x_times -----------+-------- 1 | 2 2 | 1 3 | 2

票数 0
EN

Stack Overflow用户

发布于 2018-07-10 09:25:31

代码语言:javascript
复制
select distinct d.*, CA.cnt
from discounts d
  CROSS APPLY 
    (SELECT count(0) cnt from tickets t2 
                                join discounts d2 
                                  on d.DiscountId = d2.discountid 
                                     and d2.itemid =  t2.itemid 
                                      and d2.categoryid = t2.categoryid) CA
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51260804

复制
相关文章

相似问题

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