我正在尝试连接两个表:属性和库存。我需要获取不同仓库中我们类别的总库存。
我有两张桌子:
Inventory
:这张表可以告诉我某件商品在某个日期的库存情况。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
如果这就是您使用的字面意思:
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 的语法可能不同。