【问题标题】:SQL group by, let null value staySQL group by,让空值留在
【发布时间】:2015-11-18 02:21:44
【问题描述】:

我有一个这样的传输历史 SQL 表:

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 年 7 月 14 日送出,并于 01 年 1 月 15 日归还,之后于 01 月 15 日再次发出并于 13 年 5 月 15 日归还。所以它在我的办公室里。

ID 为 4 的物品于 16.07.14 送出,并于 28.07.15 归还,之后于 28.07.15 再次发出。所以它不在我的办公室里

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

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 分组时,空日期会消失,我仍然有多个项目:

SELECT 
    table.item_ID,
    table.Date_out, 
    table.Date_in
FROM table 
WHERE table.date_in<Now()
GROUP BY table.item_ID

有人有想法吗?

【问题讨论】:

  • 您想要两个查询还是一个?预期的结果是什么?还按方法显示您的小组。您还应该说明您正在使用什么 rdbms(例如 MySql、Oracle 或 SQL-Server)。
  • 可以添加当前的SQL吗?我认为 Rank/Row_Number 可能会对此进行排序。
  • 请编辑您的问题并包括您正在执行的查询、您期望的结果以及您获得的结果。谢谢。
  • 首先,您必须将日期存储为 DATES!!
  • @Strawberry - 1. 谁告诉你它没有按日期排序? 2. 为什么强制存储为日期?

标签: sql ms-access group-by


【解决方案1】:

您的问题的另一种解决方案

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;

【讨论】:

    【解决方案2】:
    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 |
    +----------+
    

    或者,没那么有用……

    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        |
    +---------+----------+
    

    【讨论】:

    • 阅读问题的详细信息。 MS-ACCESS,不是 MySQL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多