首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL组by,让null值保持不变

SQL组by,让null值保持不变
EN

Stack Overflow用户
提问于 2015-08-24 15:27:25
回答 2查看 112关注 0票数 3

我有一个用于传输历史记录的SQL表,如下所示:

代码语言:javascript
复制
ID | Date_out | Date_in
---+----------+----------
1  | 01.01.15 | 
2  | 01.01.15 | 13.05.15
2  | 16.07.14 | 01.01.15
4  | 28.07.15 |
4  | 16.07.14 | 28.07.15

你可以说,ID 2的物品在16.07.14送出,01.01.15返回,之后01.01.15再次出货,13.05.15返回。所以在我办公室。

ID为4的物品于16.07.14送出,28.07.15返回,之后于28.07.15再次外出。所以它不在我的办公室

现在我想要一个包含在我办公室里的每个项目的列表和一个包含不在我办公室的项目的列表。我必须使用Microsoft。

代码语言:javascript
复制
result 1: Items in my office

ID | Date_out | Date_in
---+----------+----------
2  | 01.01.15 | 13.05.15


result 2: Items outside my office
 ID | Date_out | Date_in
---+----------+----------
1  | 01.01.15 | 
4  | 28.07.15 |

问题是我有很多次的物品。当我按ID分组时,空日期就消失了,而且我仍然有多个项:

代码语言:javascript
复制
SELECT 
    table.item_ID,
    table.Date_out, 
    table.Date_in
FROM table 
WHERE table.date_in<Now()
GROUP BY table.item_ID

有谁有主意吗?

EN

回答 2

Stack Overflow用户

发布于 2015-08-24 15:48:38

另一个解决你问题的方法

代码语言:javascript
复制
SELECT 
id,
CASE
    WHEN
        SUM(CASE WHEN date_in IS NULL THEN 1 ELSE 0 END) > 0
    THEN 'out'
    ELSE 'in'
END
FROM
  table_name
GROUP BY id;
票数 0
EN

Stack Overflow用户

发布于 2015-08-24 16:24:29

代码语言:javascript
复制
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(ID INT NOT NULL
,Date_out DATE NOT NULL
,Date_in DATE NULL
,PRIMARY KEY(id,date_out)
);

INSERT INTO my_table VALUES
(1  ,'2015-01-01',NULL),
(2  ,'2015-01-01','2015-05-13'),
(2  ,'2014-07-16','2015-01-01'),
(4  ,'2015-07-28',NULL),
(4  ,'2014-07-16','2015-07-28');

SELECT x.id on_loan 
  FROM my_table x 
  JOIN  
     ( SELECT id, MAX(date_out) max_date_out FROM my_table GROUP BY id) y 
    ON y.id = x.id 
   AND y.max_date_out = x.date_out 
 WHERE date_in IS NULL;
+---------+
| on_loan |
+---------+
|       1 |
|       4 |
+---------+

SELECT x.id in_stock 
  FROM my_table x 
  JOIN (SELECT id, MAX(date_out) max_date_out FROM my_table GROUP BY id) y 
    ON y.id = x.id 
   AND y.max_date_out = x.date_out 
  WHERE date_in IS NOT NULL;
+----------+
| in_stock |
+----------+
|        2 |
+----------+

或者,不太有用..。

代码语言:javascript
复制
SELECT GROUP_CONCAT(CASE WHEN date_in IS NULL THEN x.id END) on_loan
     , GROUP_CONCAT(CASE WHEN date_in IS NOT NULL THEN x.id END) in_stock 
  FROM my_table x 
  JOIN 
     ( SELECT id, MAX(date_out) max_date_out FROM my_table GROUP BY id) y 
    ON y.id = x.id AND y.max_date_out = x.date_out;
+---------+----------+
| on_loan | in_stock |
+---------+----------+
| 1,4     | 2        |
+---------+----------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32186058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档