SQL表联接并基于查询生成新列
我有三张桌子 交易 产品 日期 事务表有列 日期id、产品id、支出金额、数量、事务处理fid。 产品表有 产品标识、描述、类别 和日期表 日期,星期。 如果产品在过去4周内售出,我需要将其标记为活动产品,否则为非活动产品SQL表联接并基于查询生成新列,sql,oracle,Sql,Oracle,我有三张桌子 交易 产品 日期 事务表有列 日期id、产品id、支出金额、数量、事务处理fid。 产品表有 产品标识、描述、类别 和日期表 日期,星期。 如果产品在过去4周内售出,我需要将其标记为活动产品,否则为非活动产品 如何进行此操作。如果您离开加入到过去4周内有交易的产品id,那么您可以使用案例作为标志 例如: SELECT p.* , (CASE WHEN wk4.prod_id IS NOT NULL THEN 'Y' ELSE 'N' END) AS isActive FROM Pr
如何进行此操作。如果您离开加入到过去4周内有交易的产品id,那么您可以使用案例作为标志 例如:
SELECT p.*
, (CASE WHEN wk4.prod_id IS NOT NULL THEN 'Y' ELSE 'N' END) AS isActive
FROM Product p
LEFT JOIN (
SELECT t.prod_id
FROM Transaction t
JOIN "date" d ON d.date_id = t.date_id
WHERE d.week_id >= to_number(to_char(current_date-(7*4), 'YYYYWW'))
GROUP BY t.prod_id
) wk4 ON wk4.prod_id = p.prod_id
我终于找到了做这件事的方法
SELECT pr.prod_id, (case when count(distinct tr.transaction_fid)>=1 THEN 'Y' ELSE 'N' end) as active_flag
FROM transaction tr
INNER JOIN product pr ON pr.prod_id = tr.prod_id
INNER JOIN
(
SELECT date_id, week_id
FROM date
WHERE week_id BETWEEN 201815 AND 201818
) d ON d.date_id = tr.date_id
使用EXISTS子句检查产品是否存在日期范围内的事务
select
p.*
case when exists
(
select *
from transaction t
join date d on d.date_id = t.date_id
where t.prod_id = p.prod_id
and d.week_id between 201815 and 201818
) then 1 else 0 end as is_active
from product p;
在你的桌子上看不到任何日期是很奇怪的。在您的请求中,您要求的是最后四周,当然,如果不知道交易日期,这是不可能的。但是,在您的请求评论中,您说您希望查看201815和201818之间的范围week_id,因此我使用了此选项。您尝试了什么请解释?什么是周id?请用一些数据解释周id是每周的唯一指标。我尝试的是查找week_id在201815-201818范围内的每种产品的交易\u fid计数。请通过单击下面的链接来回答您的问题,并根据该数据添加一些和预期输出。请你的问题-不要在评论中发布代码或附加信息交易、产品、日期、交易\u fid是4个表…嘿,我发现有一个外键用于链接到日期表,这有点奇怪。更常见的情况是,您只会在表中看到日期/日期时间/时间戳,日历表的日期类型字段上有一个主键。当然,除非在本例中该日期\ id是一个日期,而不是一个INT。您似乎缺少pr.prod\ id的一个组。并且内部联接只显示给定范围内的产品,即active\ U标志='Y',因此您找不到任何其他产品。您将需要一个外部联接。但我无论如何都不会加入。使用EXISTS检查产品的数据范围中是否存在事务。请看我对此的回答。