【问题标题】:How to make a query showing purchases of a client on the same day, but only if those were made in diffrent stores (oracle)?如何查询显示客户在同一天的购买情况,但前提是这些购买是在不同的商店(oracle)中进行的?
【发布时间】:2022-01-07 23:29:52
【问题描述】:

我想展示客户在同一天至少进行 2 次购买的案例。但我只想计算在不同商店进行的购买。 到目前为止,我有:

Select Purchase.PurClientId, Purchase.PurDate, Purchase.PurId
from Purchase  
join 
( 
 Select count(Purchase.PurId), 
   Purchase.PurClientId, 
   to_date(Purchase.PurDate)
 from Purchases
 group by Purchase.PurClientId, 
      to_date(Purchase.PurDate)
 having count (Purchase.PurId) >=2 
 ) k 
    on k.PurClientId=Purchase.PurClientId

但我不知道如何让它只计算在不同商店生产的购买。允许识别商店的列是Purchase.PurShopId。 感谢您的帮助!

【问题讨论】:

  • 欢迎堆栈溢出。请阅读如何发布minimal reproducible example。我很乐意为您提供帮助,但如果没有 ddl 和一些示例数据(以脚本的形式,而不是屏幕截图的形式),这很难。尽量让人们可以轻松地为您提供帮助。

标签: sql oracle count subquery


【解决方案1】:

你可以使用:

SELECT PurId,
       PurDate,
       PurClientId,
       PurShopId
FROM   (
  SELECT p.*,
         COUNT(DISTINCT PurShopId) OVER (
           PARTITION BY PurClientId, TRUNC(PurDate)
         ) AS num_stores
  FROM   Purchase p
)
WHERE  num_stores >= 2;

或者

SELECT *
FROM   Purchase p
WHERE  EXISTS(
  SELECT 1
  FROM   Purchase x
  WHERE  p.purclientid = x.purclientid
  AND    p.purshopid != x.purshopid
  AND    TRUNC(p.purdate) = TRUNC(x.purdate)
);

其中,对于样本数据:

CREATE TABLE purchase (
  purid PRIMARY KEY,
  purdate,
  purclientid,
  PurShopId
) AS
SELECT 1, DATE '2021-01-01', 1, 1 FROM DUAL UNION ALL
SELECT 2, DATE '2021-01-02', 1, 1 FROM DUAL UNION ALL
SELECT 3, DATE '2021-01-02', 1, 2 FROM DUAL UNION ALL
SELECT 4, DATE '2021-01-03', 1, 1 FROM DUAL UNION ALL
SELECT 5, DATE '2021-01-03', 1, 1 FROM DUAL UNION ALL
SELECT 6, DATE '2021-01-04', 1, 2 FROM DUAL;

两个输出:

PURID PURDATE PURCLIENTID PURSHOPID
2 2021-01-02 00:00:00 1 1
3 2021-01-02 00:00:00 1 2

db小提琴here

【讨论】:

  • 谢谢,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多