问题简介:我正在开发条形码跟踪系统,从StationID 1开始,沿着生产线放置5个扫描站,最后一个站是StationID 5。每个条形码对应于沿着生产线制造的一个项目。有些项目,比如条形码95821的,不会经过预处理,因此不会被StationID 1扫描。
问题:我很难构建一个查询,该查询显示所有通过StationID 2但尚未到达StationID 3,或4或5的条形码:列出所有已同时通过StationID 1和StationID 2(类似于95813,95814,95823,95824)的条形码--仅通过StationID 2(类似95821),因为它没有经过预处理。
下面是一个名为扫描器的示例表:
+---------+-----------+----------+
| Barcode | StationID | Time |
+---------+-----------+----------+
| 95813 | 1 | 11:30:01 |
| 95814 | 1 | 11:30:05 |
| 95823 | 1 | 11:30:10 |
| 95824 | 1 | 11:30:20 |
| 95821 | 2 | 11:35:10 |
| 95813 | 2 | 11:40:01 |
| 95814 | 2 | 11:40:02 |
| 95823 | 2 | 11:30:10 |
| 95824 | 2 | 11:30:20 |
| 95813 | 3 | 11:40:01 |
| 95814 | 3 | 11:40:02 |
| 95813 | 4 | 11:45:10 |
| 95814 | 4 | 11:45:30 |
| 95813 | 5 | 11:47:20 |
+---------+-----------+----------+预期结果集:
+---------+
| Barcode |
+---------+
| 95821 |
| 95823 |
| 95824 |
+---------+我使用下面的查询列出所有已被StationID 1扫描的条形码,并且没有被任何其他站点扫描。
SELECT
Barcode
FROM
scanstations s
GROUP BY Barcode
HAVING SUM(CASE
WHEN s.StationID = 1 THEN 0
ELSE 1
END) = 0发布于 2019-09-24 09:06:03
我不明白为什么每个人都想让问题复杂化,使用这个查询并不容易
SELECT Barcode FROM scanstations GROUP BY Barcode HAVING MAX(StationID) = 2如果要列出StationID 1扫描过的所有条形码,但没有被任何其他站点扫描,请使用HAVING MAX(StationID) = 1。
如果要列出通过StationID 1和StationID 2的所有条形码,请使用HAVING MAX(StationID) = 2 AND COUNT(*) = MAX(StationID)
如果要列出仅通过StationID 2的所有条形码,请使用HAVING MAX(StationID) = 2 AND COUNT(*) < MAX(StationID)
发布于 2019-09-24 08:24:42
按照您的意图,您可以测试分数以下是您的查询。
(查询1)显示通过StationID 2但尚未达到StationID 3或4或5的所有条形码:
SELECT Barcode ,SUM(CASE WHEN s.StationID = 1 THEN -99999999 WHEN s.StationID = 2 THEN 10 WHEN s.StationID = 3 THEN 1 WHEN s.StationID = 4 THEN 1 WHEN s.StationID = 5 THEN 1 ELSE 0 END) as sumcheck FROM scanstations s GROUP BY Barcode HAVING sumcheck >= 10 and sumcheck <= 12
(查询2)列出所有已通过StationID 1和StationID 2的条形码(类似于95813,95814,95823,95824)
SELECT Barcode ,SUM(CASE WHEN s.StationID = 1 THEN 10 WHEN s.StationID = 2 THEN 10 WHEN s.StationID = 3 THEN -99999999 WHEN s.StationID = 4 THEN -99999999 WHEN s.StationID = 5 THEN -99999999 ELSE 0 END) as sumcheck FROM scanstations s GROUP BY Barcode HAVING sumcheck = 20
(查询3)列出所有条形码:-只通过StationID 2(比如95821),因为它没有经过预处理
SELECT Barcode ,SUM(CASE WHEN s.StationID = 1 THEN -99999999 WHEN s.StationID = 2 THEN 10 WHEN s.StationID = 3 THEN -99999999 WHEN s.StationID = 4 THEN -99999999 WHEN s.StationID = 5 THEN -99999999 ELSE 0 END) as sumcheck FROM scanstations s GROUP BY Barcode HAVING sumcheck = 10
我编辑是因为不太清楚。
也许它们并不像您所预期的那么短,但我认为它们很容易理解(如果您有sql的基础),并且对您的逻辑应用更有意义。有时候,这并不是最好的压缩方法,因为如果您在将来进行维护,您将不得不重新解释,这并不总是一个好的选择。
发布于 2019-09-24 08:25:12
你可以试着选择条形码,它有一些不同于最大站号的条形码,例如:
select barcode, max(StationID), count(*)
from scanstations
GROUP BY barcode
having max(StationID) <> count(*)https://stackoverflow.com/questions/58074638
复制相似问题