我有以下表格
表农场
+---------+--------+-------------------+-----------+------------+
| FARM_ID |Stock_ID| FARM_TITLE | Size | FARM_VALUE |
+---------+--------+-------------------+-----------+------------+
| 2 | 1 | AgriZone | M | 202 |
| 3 | 1 | Cow Mill | L | 11 |
| 4 | 2 | Beef Farm | H | 540 |
| 5 | 2 | CattleOne | M | 1080 |
| 6 | 2 | FarmOne | L | 455 |
| 7 | 3 | Perdue | H | 333 |
| 8 | 4 | Holstein | M | 825 |
| 10 | 1 | Dotterers | H | 98 |
+---------+--------+-------------------+-----------+------------+
表门
+---------+---------+------------+
| GATE_ID | FARM_ID | FARM_VALUE |
+---------+---------+------------+
| 1 | 2 | 0 |
| 1 | 3 | 0 |
| 1 | 4 | 540 |
| 2 | 4 | 550 |
| 3 | 4 | 560 |
| 4 | 4 | 570 |
| 5 | 4 | 580 |
| 6 | 4 | 590 |
| 1 | 5 | 1080 |
| 2 | 5 | 1100 |
| 3 | 5 | 1120 |
| 4 | 5 | 1140 |
| 5 | 5 | 1160 |
| 6 | 5 | 1180 |
| 1 | 6 | 455 |
| 2 | 6 | 536 |
| 3 | 6 | 617 |
| 4 | 6 | 698 |
| 5 | 6 | 779 |
| 6 | 6 | 860 |
| 1 | 7 | 0 |
| 1 | 8 | 0 |
| 1 | 10 | 0 |
+---------+---------+------------+
表原点
+--------+----------+
| ORI_ID | ORI_NAME |
+--------+----------+
| 1 | US |
| 2 | CA |
| 3 | MX |
+--------+----------+
表库存
+--------+--------+-------------------+
|Stock_ID| ORI_ID | Stock_TITLE |
+--------+--------+-------------------+
| 1 | 1 | P1 |
| 2 | 2 | P3 |
| 3 | 3 | Q4 |
| 4 | 3 | B3 |
+--------+--------+-------------------+
表结果
+-----------+---------+---------+------------+------------+
| RESULT_ID | FARM_ID | GATE_ID | FARM_VALUE | Score% |
+-----------+---------+---------+------------+------------+
| 1 | 7 | 1 | 333 | 100 |
| 2 | 8 | 1 | 825 | 100 |
| 3 | 6 | 1 | 455 | 40 |
| 4 | 6 | 2 | 536 | 0 |
| 5 | 6 | 3 | 617 | 0 |
| 6 | 6 | 4 | 698 | 100 |
| 7 | 6 | 5 | 779 | 0 |
| 8 | 6 | 6 | 860 | 10 |
| 9 | 4 | 1 | 540 | 100 |
| 10 | 4 | 2 | 550 | 90 |
| 11 | 4 | 3 | 560 | 0 |
| 12 | 4 | 4 | 570 | 100 |
| 13 | 4 | 5 | 580 | 10 |
| 14 | 4 | 6 | 590 | 0 |
| 15 | 5 | 1 | 1080 | 0 |
| 16 | 5 | 2 | 1100 | 0 |
| 17 | 5 | 3 | 1120 | 0 |
| 18 | 5 | 4 | 1140 | 50 |
| 19 | 5 | 5 | 1160 | 0 |
| 20 | 5 | 6 | 1180 | 100 |
| 21 | 3 | 1 | 11 | 100 |
| 22 | 10 | 1 | 98 | 90 |
| 23 | 2 | 1 | 202 | 100 |
+-----------+---------+---------+------------+------------+
带注释的结果表:与上面相同^
+-----------+---------+---------+------------+------------+
| RESULT_ID | FARM_ID | GATE_ID | FARM_VALUE | Score% |
+-----------+---------+---------+------------+------------+
+-----------+---------+---------+------------+------------+
| 1 | 7 | 1 | 333 | 100 | <--|H-Case {H}
+-----------+---------+---------+------------+------------+
+-----------+---------+---------+------------+------------+
| 2 | 8 | 1 | 825 | 100 | <--|M-Case {M}
+-----------+---------+---------+------------+------------+
+-----------+---------+---------+------------+------------+
| 3 | 6 | 1 | 455 | 40 |
| 4 | 6 | 2 | 536 | 0 |
| 5 | 6 | 3 | 617 | 0 |
| 6 | 6 | 4 | 698 | 100 | <--|L
| 7 | 6 | 5 | 779 | 0 | |
| 8 | 6 | 6 | 860 | 10 | |
+-----------+---------+---------+------------+------------+ |
| 9 | 4 | 1 | 540 | 100 | |
| 10 | 4 | 2 | 550 | 90 | |
| 11 | 4 | 3 | 560 | 0 | |
| 12 | 4 | 4 | 570 | 100 | <--+M-case {H,M,L}
| 13 | 4 | 5 | 580 | 10 | |
| 14 | 4 | 6 | 590 | 0 | |
+-----------+---------+---------+------------+------------+ |
| 15 | 5 | 1 | 1080 | 0 | |
| 16 | 5 | 2 | 1100 | 0 | |
| 17 | 5 | 3 | 1120 | 0 | |
| 18 | 5 | 4 | 1140 | 50 | <--|H
| 19 | 5 | 5 | 1160 | 0 |
| 20 | 5 | 6 | 1180 | 100 |
+-----------+---------+---------+------------+------------+
+-----------+---------+---------+------------+------------+
| 21 | 3 | 1 | 11 | 100 | <--|L
| 22 | 10 | 1 | 98 | 90 | <--+H-case {H,M,L}
| 23 | 2 | 1 | 202 | 100 | <--|M
+-----------+---------+---------+------------+------------+
需要进行计算:
所有独特的案例
案例{H,M}:H = 80 M = 20
进一步说明
GATE
的股票,完全满意,最多可获得100分
Q4
有3套6 GATES
;只有一个GATE
集必须满足(存在分数)。Q4
具有案例{H,M,L},这意味着H = 70; M = 20; L = 10这将导致(70 * 100%)+(20 * 50%)+(10 * 100%)= 90 (回顾上面的Result表注释) 如果我们执行查询以了解表格和数据,它将如下所示
+---------+-----------+---------------+-----------+---------+-----------+---------+
| Origin | Stock | Farm Title | Farm Value| Gate | Size | Score |
+---------+-----------+---------------+-----------+---------+-----------+---------+
| US | P1 | Perdue | 333 | 1 | H | 100 |
| US | P3 | Holstein | 825 | 1 | M | 100 |
| CA | Q4 | FarmOne | 455 | 1 | L | 40 |
| CA | Q4 | FarmOne | 536 | 2 | L | 0 |
| CA | Q4 | FarmOne | 617 | 3 | L | 0 |
| CA | Q4 | FarmOne | 698 | 4 | L | 100 |
| CA | Q4 | FarmOne | 779 | 5 | L | 0 |
| CA | Q4 | FarmOne | 860 | 6 | L | 10 |
| CA | Q4 | Beef Farm | 540 | 1 | H | 0 |
| CA | Q4 | Beef Farm | 550 | 2 | H | 90 |
| CA | Q4 | Beef Farm | 560 | 3 | H | 0 |
| CA | Q4 | Beef Farm | 570 | 4 | H | 100 |
| CA | Q4 | Beef Farm | 580 | 5 | H | 10 |
| CA | Q4 | Beef Farm | 590 | 6 | H | 0 |
| CA | Q4 | CattleOne | 1080 | 1 | M | 0 |
| CA | Q4 | CattleOne | 1100 | 2 | M | 0 |
| CA | Q4 | CattleOne | 1120 | 3 | M | 0 |
| CA | Q4 | CattleOne | 1140 | 4 | M | 50 |
| CA | Q4 | CattleOne | 1160 | 5 | M | 100 |
| CA | Q4 | CattleOne | 1180 | 6 | M | 0 |
| MX | B3 | Cow Mill | 11 | 1 | L | 100 |
| MX | B3 | Dotterers | 98 | 1 | H | 90 |
| MX | B3 | AgriZone | 202 | 1 | M | 100 |
+---------+-----------+---------------+-----------+---------+-----------+---------+
欲望结果
+---------+-------------------+-------+
| Origin | Stock | score |
+---------+-------------------+-------+
| US | P1 | 100 |
| US | P3 | 100 |
| CA | Q4 | 90 |
| MX | B3 | 93 |
+---------+-------------------+-------+
由于origin
的{{1}}由3个不同的stock
组成,而farms
各有6个farms
。只要将一个gates
- 集(数字匹配gate
)评分为某个值,我们就可以认为完全找到了整个gates
。这是STOCK
可以被视为100的唯一方法。
此外,并重申,stock
Q4有案例:{H,M,L}并且在某种程度上发现了所有STOCK
。 gate (4)
4得分(100%* H)+(50%* M)+(100%* L)等于(70 * 100%)+(20 * 50%)+(10 * 100%) )= 90
因此:(取自上文)
gate
QED
所以我需要帮助是创建子查询/子选择来使这个计算工作。我在下面的SQL小提琴链接中设置了上面场景中的所有内容(以及我正在使用的正在进行的查询)。
非常感谢stackoverflow社区。 p>
答案 0 :(得分:4)
这是我一直在研究的查询。但是,结果与您在问题中发布的结果略有不同:
select o.origin_name, s.stock_title, sum(
case f.size
when 'H' then
case
when sizes = 'H,L,M' then 70
when sizes = 'H,M' then 80
when sizes = 'H,L' then 90
when sizes = 'H' then 100
else 0
end
when 'M' then
case
when sizes = 'H,L,M' then 20
when sizes = 'H,M' then 20
when sizes = 'L,M' then 60
when sizes = 'M' then 100
else 0
end
else
case
when sizes = 'H,L,M' then 10
when sizes = 'L,M' then 40
when sizes = 'H,L' then 10
when sizes = 'L' then 100
else 0
end
end * r.score / 100) FinalScore
from farm f
join (
select f.stock_id, group_concat(distinct f.size order by f.size) sizes
from farm f
join results r on f.farm_id = r.farm_id
group by f.stock_id
) stockSizes on f.stock_id = stockSizes.stock_id
join results r on f.farm_id = r.farm_id
join (
select f.stock_id, r.gate_id
from results r
join farm f on r.farm_id = f.farm_id
group by f.stock_id, r.gate_id
having sum(r.score = 0) = 0
) FullGates
on FullGates.stock_id = f.stock_id and FullGates.gate_id = r.gate_id
join stock s on s.stock_id = f.stock_id
join origin o on o.origin_id = s.origin_id
group by o.origin_id, s.stock_id
结果:
+-------------+-------------+------------+ | ORIGIN_NAME | STOCK_TITLE | FINALSCORE | +-------------+-------------+------------+ | US | P1 | 93 | | CA | P3 | 90 | | MX | Q4 | 100 | | MX | B3 | 100 | +-------------+-------------+------------+
如果这样做,请告诉我。
答案 1 :(得分:1)
我会使用您的原始查询来获取倒数第二个表并通过添加使用Select
(找到here)更改distinct
并仅选择原点,库存和计算得分了。例如,如果得分是所有这些得分的平均值,那么AVG(Score)
就是Score
将是您在原始查询中获取的内容。如果你只想使用具有相同Origin和Stock的项目的一小部分来计算得分,我会在选择中使用子查询,其中匹配Origin和Stick ID,所以你有:
Select Origin,
Stock,
(select calculation(Score) from tables where tables.stock_id = .... tables.origin_id = .....)
From....
希望这有帮助。