为什么我的加入没有过滤掉日期? SQL语法

问题描述 投票:0回答:1

我正在尝试连接两个表:属性和库存。我需要获取不同仓库中我们类别的总库存。

我有两张桌子:

  1. Inventory
    :这张表可以告诉我某件商品在某个日期的库存情况。
  2. Attributes
    :这个表可以告诉我一个项目当前的分类。

通常我运行这样的查询来获取每个分类的库存,我使用库存表,但我对 WHERE 子句进行嵌套查询以从属于唯一分类的 ItemId 中获取库存:

select
    warehouse_id,
    ItemId,
    sum(on_hand_quantity) as inventory
from 
    inventory a
where 
    and warehouse_id in ('Warehouse1', 'Warehouse2')
    and to_char(snapshot_day,'YYYY,MM,DD') = 'YYYY,MM,DD' 
    and ItemId in (Select ItemId
from 
    attributes
where 
    Class  in ('Class1'))
group by   
    1,2

由于我对每个分类都运行了一次此查询,因此我尝试创建一个看起来像这样的连接以使用 Class 而不是项目 ID 获取 on_hand_quantity,查询运行但返回的库存数量远高于实际数量。我认为 sum() 函数正在获取所有历史值,而不是按 where 子句中规定的日期进行过滤,但我还没有找到解决这个问题的方法。

SELECT 
    uic.snapshot_day,
    uic.warehouse_id,
    Sum(Case When att.Class = 'Class1' 
         Then uic.on_hand_quantity Else 0 End) as Class1_inventory
    Sum(Case When att.Class= 'Class2' 
         Then uic.on_hand_quantity Else 0 End) as Class2_inventory,
    Sum(Case When att.stamp = 'Class3' 
         Then uic.on_hand_quantity Else 0 End) as Class3_inventory

FROM inventory uic  JOIN attributes att 
    ON uic.ItemId = att.ItemId

WHERE 
    AND uic.warehouse_id in (‘Warehouse1’, ‘Warehouse2’)
    AND att.class in ('Class1','Class2','Class3')
    AND to_char(uic snapshot_day,'YYYY,MM,DD') = 'YYYY,MM,DD' 
    
GROUP BY 2,1
sql join filtering aggregate-functions
1个回答
0
投票

如果这就是您使用的字面意思:

to_char(uic.snapshot_day,'YYYY,MM,DD') = 'YYYY,MM,DD'
它根本行不通。当您将日期转换为字符串时,您会得到类似“
2023,04,03
”的结果,它永远不会等于“
YYYY,MM,DD

您还希望避免将每一行的日期值更改为字符串,而是在比较中使用日期。例如

uic.snapshot_day = to_date('2023-04-03','YYYY-MM-DD')

或者,如果该列是时间戳或类似的:

uic.snapshot_day >= to_date('2023-04-03','YYYY-MM-DD')
and uic.snapshot_day < to_date('2023-04-04','YYYY-MM-DD')

nb:“to_date”是一个假设,因为未识别 dbms,您的 dbms 的语法可能不同。

© www.soinside.com 2019 - 2024. All rights reserved.