我有一个逻辑问题来计算这个表的最终值:
https://i.stack.imgur.com/YPXXX.png
我需要计算每一行,列TIPO
的值为“E”+1,对于“S”-1,按列Codigo
和Configuracao
.
基本上,我需要一个简单的库存控制,列Codigo
和Configuracao
是产品列控制,并且TIPO
是运动类型,S = OUT 和 E = IN
谁能给我一盏灯?
我有一个逻辑问题来计算这个表的最终值:
https://i.stack.imgur.com/YPXXX.png
我需要计算每一行,列TIPO
的值为“E”+1,对于“S”-1,按列Codigo
和Configuracao
.
基本上,我需要一个简单的库存控制,列Codigo
和Configuracao
是产品列控制,并且TIPO
是运动类型,S = OUT 和 E = IN
谁能给我一盏灯?
未经测试,但也许这个
select SUM(t1.TipoNumeric), t1.CODIGO, t1.CONFIGURACAO from (
select
case (TIPO)
when 'E' then 1
when 'S' then -1
else 0
end as TipoNumeric,
CODIGO,
CONFIGURACAO
from MyTable
) as t1
group by t1.CODIGO, t1.CONFIGURACAO
只需添加 +1/-1 列,也许?
alter table MyTable
add tipo_val computed by
(
decode( upper(TIPO), 'E', +1, 'S', -1 )
)
进而:
Select * from MyTable;
Select SUM(tipo_val), CODIGO, CONFIGURACAO
From MyTable
Group by 2, 3
PS不要用图片来展示你的数据。
而是将它们作为脚本放入http://dbfiddle.uk/?rdbms=firebird_3.0,然后使用 Markdown Export 将数据和超链接复制到您的问题文本中。
PPS 我相信你的整个方法在那里是错误的,如果“需要一个简单的库存控制”。
我认为你的表应该有这样的列:
代理行 ID,primary key
自动递增整数,32 位或 64 位
标识您的项目的列,通常它是一个单一的替代整数 SKU(库存单位)引用(参见 - 外键)另一个“字典表”。在您的情况下,它似乎是两列Codigo
,Configuracao
但这也意味着您不能添加有关您的商品的额外信息(“属性”),例如价格或照片(阅读:数据库规范化)。与使用单个整数列相比,它还使 Firebird 引擎的分组更加困难。另外,您确实在index
项目识别列上创建了一个,不是吗?您对这些选择的查询计划是什么,他们是否使用索引Codigo
和Configuracao
/或临时外部排序?
操作的timestamp
,由 Firebird 服务器自动设置为current_timestamp
,因此您始终知道插入该行的确切时间。索引,当然。
添加该行的计算机用户再次由 Firebird 服务器自动设置为您将创建current_user
的某个表中的用户 ID 。stock_workers
当然,也被索引了。
操作的一些描述,例如合同编号或卖方名称,任何可以帮助您稍后记住该行甚至描述的真实世界事件的任何内容。作为自由格式文本,它可能不会被索引。但也许您最终会制作一些contracts
或sellers
表格并向这些表格添加整数引用(FK ID)?这取决于哪种类型的数据会经常重复,足以值得提取到额外的索引列中。
也许是一个单位度量,也许你所有的单位永远只能以整数为单位来衡量。但也许会有一些以公斤、米、升等为单位的物品?
最后是两个整数(或浮点数?)列,例如Qty_Income
和Qty_Outcome
,您可以在其中记录从仓库中添加或取出的项目数量。不会有那个E/S栏!将有两个整数列,您可以将数字放入其中。为什么?阅读上面有关簿记的文章!
在这样的数据库方案中,您的查询最终将如下所示:
select Sum(s.Qty_Income) as Credit, Sum(s.Qty_Outcome) as Debit,
Sum(s.Qty_Income) - Sum(s.Qty_Outcome) as Saldo,
min(g.Codigo), min(g.Configuracao)
from stock_movements s
join known_goods g on g.ID = s.SKU_ID
group by s.SKU_ID
而且您还可以灵活地按工人、日期或数量(例如,只关心在一个操作中添加 1000 或更多项目等大事件)或任何东西来灵活地组合类似的请求。