sql-server - Sql Server:定义要考虑的行
问题描述
我需要帮助来解决我认为的一个简单问题,因为我真的不擅长 SQL。因此,我的查询中的所有内容都运行良好,但我需要对其进行调整以自动化一个过程。我在不同的仓库(AA.Armazem)中有一个产品,我的目标是选择其中一个仓库的库存(AA.StkActual),具体取决于每个仓库的 StockValue 。所以,我总是想首先考虑AA.Armazem = 'A7',然后是 'A8 ',然后是 'A9'。如果仓库 'A7' 的 stock = 0 ,我只会考虑仓库 'A8' ,因此,仅当 'A7' 和 'A8' 缺货 (AA.StkActual = 0) 时才考虑仓库 'A9'。
现在我的问题是,因为我想要最小的 StockValue,所以当我应该得到 AA.Armazem = 'A7' 的 AA.StkActual 时,我得到了 AA.Armazem = 'A9' 的 AA.StkActual,因为它还是有单位的。PS有问题的组件来自 AA.Familia = 98。还有其他家族的组件,但就像我说的,它们都在“A7”仓库中。
这是我的查询:
select
A1.Artigo as Artigo,
A1.Descricao as Descricao, (coalesce(MIN(
case
when AA.Armazem = 'A7' then
CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
else
null
end
), MIN(
case
when AA.Armazem = 'A8' then
CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
else
null
end
), MIN(
case
when AA.Armazem = 'A9' then
CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
else
null
end
))) as Stock,
0 as QuantidadeEmEncomendasPendentes,
'Componente Stock' As Id
from
Artigo A1
join ComponentesArtigos CA On CA.ArtigoComposto = A1.Artigo
join Artigo A2 On A2.Artigo = CA.Componente And (A2.Familia IN (37,38,39,45,98))
join ArtigoArmazem AA ON AA.Artigo = A2.Artigo And (AA.Armazem IN ('A7','A8', 'A9'))
group by
A1.Artigo,
A1.Descricao
我提出的查询给了我最低库存作为结果,但是,如果我只是得到所有组件,我会得到这个结果:
查询所有组件且没有 MIN 正如您在图像上看到的那样,“SBC”组件是来自 AA.Familia = 98; 的组件。我需要查询首先考虑AA.Armazem = 'A7' 中的 AA.StkActual,然后是 'A8',然后是 'A9',正如我所解释的,但仅适用于 AA.Familia = 98 的组件。它只考虑如果前一个仓库的库存 = 0,则为其他仓库。
如果我使用 MIN 条件运行查询,我将得到 8 的 StkValue ,这没有错,问题是,我需要考虑 154 的 StkValue ,因为它位于 'A7' Warehouse 上。因此,如果您查看我提供的查询,我希望得到以下结果:查询最小 StkValue -> 值 25 (50/2) 来自库存最少的组件 (DIMM DDR3)(即信息我需要知道我最多可以制造多少产品),而不是让 Stock = 8 因为在这种情况下,我真的需要考虑 AA.Familia = 98 的组件来自仓库“A7”的库存
我希望你能理解我,我尽我所能向你展示问题以及我想要/需要做什么。
第一次编辑:这是一个子查询!
第二次编辑:我已将查询更改为我正在使用的查询,而不是向您显示针对 AA.Familia = 98 产品的查询。
第三次编辑:更好地解释问题
第 4 次编辑:下图并将上述查询更新为我正在使用/尝试解决的问题以获取解决方案。
如您所见,我已经圈出了我需要为 3 种不同产品(25;6;12)获取的 StockValues。但是,我从 Jeremy 的回答中得到的值是 25;6;15.
每个组件(SBC、CPU、RAM、HDD、DVDRW)都有自己的库存。第二个产品的 stock = 6 是因为我们已经构建了 2 台这样的计算机,所以对于我们试图获得的查询,Stock = 4 基本上。
我怎样才能做到这一点?
此致
解决方案
我想指出,您确实应该在此处更改您的别名Artigo
——将其命名为A1
,并且A2
当您在AA.Armazem
命名为 A7、A8 和 A9 中也有数据值时,这会使您对这个问题的思考变得非常混乱。
这样一来,您很可能希望在开始比较之前先调整 A7、A8 和 A9 值。如果需要,您可以使用枢轴语法,但我认为这里没有必要这样做。反而,
select
A1.Artigo as Artigo,
A1.Descricao as Descricao,
MIN(
case
when AA.Armazem = 'A7' then
CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
else
null
end
) AS StockA7,
MIN(
case
when AA.Armazem = 'A8' then
CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
else
null
end
) AS StockA8,
MIN(
case
when AA.Armazem = 'A9' then
CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
else
null
end
) AS StockA9,
0 as QuantidadeEmEncomendasPendentes,
'Componente Stock' As Id
from
Artigo A1
join ComponentesArtigos CA On CA.ArtigoComposto = A1.Artigo
join Artigo A2 On A2.Artigo = CA.Componente And (A2.Familia IN (37,38,39,45,98))
join ArtigoArmazem AA ON AA.Artigo = A2.Artigo And (AA.Armazem IN ('A7', 'A8', 'A9'))
group by
A1.Artigo,
A1.Descricao
然后,您可以使用此查询的结果来选择 A7 和 A8 值。
select
Artigo,
Descricao,
coalesce(
nullif(StockA7, 0),
nullif(StockA8, 0),
nullif(StockA9, 0)
) Stock
推荐阅读
- json - 使用 pyspark 处理来自事件中心的事件 - Databricks
- go - 去 lib/pq 打开方法返回 undefined: time.Until
- c++ - 创建的指针然后设置为等于数组中的索引但获得不同的值
- kubernetes - 如何知道在 Kubernetes 中创建一个 pod 需要多长时间?请问有什么命令吗?
- ios - 为什么当我点击增量按钮时我的步进器没有给出正确的值?
- c# - 如何通过字符串创建星号模式?(C#)
- python - 如何在excel / python中将多行转换为堆叠列?
- reactjs - React-Select:从下拉列表中获取多个 onChange 值
- php - 联盟在 localhost MySQL 版本 5.5.8 中工作,但在服务器 MySQL - 5.7.24 上不工作
- node.js - 如何将 Heroku 生成的服务器端口应用到我的前端 Vue.js 应用程序?