需要将此表与子字符串相加以找到正确的值

时间:2018-04-12 09:36:13

标签: mysql syntax

我坚持按照id / rev对这个表中的项目求和。 我需要以下结果:

ID1   SYS1    +/-x items (delevered items - returned items)
ID1   SYS2    +/-x items
ID1   SYS3    +/-x items
ID2   SYS1    +/-x items
ID2   SYS2    +/-x items
ID2   SYS3    +/-x items

但是我只需要减去该值来计算总和。 我用CASE WHEN建立了一个列表(内容='返回x项')那么从0到99的所有可能性,但我不认为这是去往这里的方式。 被删除的是加号,返回的是负数

CREATE TABLE IF NOT EXISTS `docs` (
  `id` varchar(200) NOT NULL,
  `rev` varchar(200)NOT NULL,
  `content` varchar(200) NOT NULL

) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`id`, `rev`, `content`) VALUES
  ('ID1', 'SYS1', 'returned 1 item'),
  ('ID2', 'SYS1', 'delivered 2 items'),
  ('ID1', 'SYS2', 'returned 41 items'),
  ('ID1', 'SYS3', 'returned 12 items'),
  ('ID2', 'SYS1', 'returned 12 items'),
  ('ID1', 'SYS1', 'delivered 11 items'),
  ('ID2', 'SYS1', 'returned 13 items'),
  ('ID1', 'SYS2', 'returned 14 items'),
  ('ID2', 'SYS2', 'delivered 11 items'),
  ('ID2', 'SYS2', 'returned 12 items'),
  ('ID1', 'SYS3', 'delivered 17 items'),
  ('ID1', 'SYS2', 'returned 11 items'),
  ('ID1', 'SYS1', 'delivered 14 items'),
  ('ID2', 'SYS1', 'returned 11 items'),
  ('ID2', 'SYS1', 'returned 14 items'),
  ('ID1', 'SYS2', 'delivered 11 items'),
  ('ID1', 'SYS1', 'returned 12 items'),
  ('ID2', 'SYS1', 'delivered 15 items'),
  ('ID1', 'SYS2', 'returned 11 items'),
  ('ID1', 'SYS1', 'delivered 14 items'),
  ('ID2', 'SYS1', 'returned 15 items'),
  ('ID1', 'SYS2', 'delivered 14 items'),
  ('ID1', 'SYS3', 'returned 18 items');

2 个答案:

答案 0 :(得分:0)

作为变体,您可以使用REPLACE功能,然后使用CAST字符串int

SELECT
  *,
  IF(content LIKE 'returned%',-1,1)*CAST(REPLACE(REPLACE(REPLACE(REPLACE(content,'delivered ',''),'returned ',''),' items',''),' item','') AS SIGNED) QtyVer1,
  IF(content LIKE 'returned%',-1,1)*SUBSTRING_INDEX(SUBSTRING_INDEX(content,' ',-2),' ',1) QtyVer2
FROM docs

您也可以尝试使用SUBSTRING_INDEX - 查看QtyVer2

使用GROUP BY

的查询
SELECT
  id,
  rev,
  SUM(IF(content LIKE 'returned%',-1,1)*SUBSTRING_INDEX(SUBSTRING_INDEX(content,' ',-2),' ',1)) Total
FROM docs
GROUP BY id,rev

SQL小提琴 - http://www.sqlfiddle.com/#!9/0611f/17

答案 1 :(得分:0)

CREATE TABLE docs (
  tDate DATETIME NULL,
  id varchar(200) NOT NULL,
  rev varchar(200)NOT NULL,
  content varchar(200) NOT NULL
);

INSERT INTO docs (tDate, id, rev, content) VALUES
  ('2018-01-01 12:00','ID1', 'SYS1', 'returned 3 item'),
  ('2018-01-02 12:00','ID1', 'SYS2', 'delivered items: 4'),
  ('2018-01-03 12:00','ID2', 'SYS3', 'returned 2 item'),
  ('2018-01-03 14:10','ID1', 'RESET', ''),
  ('2018-01-04 12:00','ID2', 'SYS1', 'delivered items: 1'),
  ('2018-01-05 12:00','ID3', 'SYS2', 'returned 1 item'),
  ('2018-01-06 12:00','ID3', 'SYS3', 'delivered items: 1'),
  ('2018-01-07 12:00','ID2', 'SYS1', 'delivered items: 1'),
  ('2018-01-08 12:00','ID3', 'SYS2', 'returned 1 item'),
  ('2018-01-09 12:00','ID1', 'SYS2', 'delivered items: 1'),
  ('2018-01-10 12:00','ID3', 'SYS3', 'returned 3 item'),
  ('2018-01-10 12:10','ID1', 'RESET', ''),
  ('2018-01-10 13:00','ID2', 'SYS3', 'delivered items: 1'),
  ('2018-01-10 13:10','ID3', 'SYS1', 'delivered items: 1'),
  ('2018-01-10 13:20','ID2', 'SYS2', 'delivered items: 3'),
  ('2018-01-10 14:00','ID3', 'SYS1', 'delivered items: 1'),
  ('2018-01-10 14:10','ID3', 'RESET', ''),
  ('2018-01-11 12:00','ID1', 'SYS2', 'returned 2 item'),
  ('2018-01-11 13:00','ID1', 'SYS1', 'delivered items: 1'),
  ('2018-01-11 14:00','ID2', 'SYS2', 'delivered items: 3'),
  ('2018-01-11 15:00','ID2', 'SYS3', 'delivered items: 2'),
  ('2018-01-11 16:00','ID3', 'SYS2', 'returned 1 item'),
  ('2018-01-11 17:00','ID3', 'SYS1', 'delivered items: 2'),
  ('2018-01-11 17:10','ID2', 'RESET', ''),
  ('2018-01-11 18:00','ID2', 'SYS3', 'delivered items: 2'),
  ('2018-01-11 19:00','ID3', 'SYS2', 'returned 1 item');

嗨,这个总结有一些新的信息:

记录有一个时间戳,我需要在表格中不同id的最后一次RESET之后的总和。 例如,ID1在2018-01-10 12:10有一个LAST重置,我只需要在此日期之后的3个SYSx总和。 是否可以在一个查询中获得9个总和?