【问题标题】:How to use union for handling date from two different tables如何使用联合处理来自两个不同表的日期
【发布时间】:2017-03-01 09:30:02
【问题描述】:

我有两张桌子。第一张表stk

ITEMID | STOCK
--------------
Test1  | 10
Test2  | 15
Test3  | 12

第二张桌子qty

ITEMID | DOCDATE   | QTY
--------------------------
Test1  | 2/28/2017 | 5
Test2  | 2/28/2017 | 8
Test3  | 2/28/2017 | 6

我使用了这个查询

select itemid,stock,docdate,qty
from (
      select itemid,stock,null docdate,0 qty from stk
      union
      select itemid,0 stock,docdate,qty from qty
     )
group by itemid,stock,docdate,qty
order by 1

我得到的输出:

ITEMID | STOCK | DOCDATE  | QTY
------------------------------
Test1  | 0     |2/28/2017 | 5
Test1  | 10    |          | 0
Test2  | 0     |2/28/2017 | 8
Test2  | 15    |          | 0
Test3  | 0     |2/28/2017 | 6
Test3  | 12    |          | 0

但我想要这个输出:

ITEMID | STOCK | DOCDATE  | QTY
------------------------------
Test1  | 10    |2/28/2017 | 5
Test2  | 15    |2/28/2017 | 8
Test3  | 12    |2/28/2017 | 6

【问题讨论】:

  • 删除所有不相关的 DBMS 标签。
  • 你似乎不需要一个联合,只需要一个简单的连接。加入您的表格不起作用有什么原因吗?还有,Oracle 还是 Mysql?

标签: mysql sql oracle11g oracle10g oracle-sqldeveloper


【解决方案1】:

如果您只想合并来自两个不同表的行,则可以使用此查询:

select itemid, MAX(stock), MAX(docdate), MAX(qty)
from (
      select itemid,stock,null docdate,0 qty from stk
      union
      select itemid,0 stock,docdate,qty from qty
     ) as t
group by itemid
order by 1

Demo here

【讨论】:

  • 它只是一个示例问题 - 我的要求仅限于工会。
  • @NirmalR 恐怕我听不懂你想说的话。能详细点吗?
  • @NirmalR 很高兴我能提供帮助。如果它帮助您解决问题,请将此或任何其他答案标记为已接受。
  • 嗨,先生,我在使用 max(docdate) 时遇到问题。如果我在 2017 年 3 月 1 日的数量表中有另一个 test1 意味着它没有显示 2017 年 2 月 28 日,请帮助解决这个问题
  • @NirmalR 能否将此案例添加到 OP 中提供的示例数据中?
【解决方案2】:

如果您的唯一目标是获得该输出,那么您可以这样做:

SELECT Q.ItemId, (SELECT S.stock FROM stk S ON S.ItemId = Q.ItemId) AS STOCK, Q.DocDate, Q.Qty FROM qty Q  

我正在使用子查询来连接 Id 上的两个表,然后我从 Stk 中选择库存,其中 ItemId 与 Qty 中的 ItemId 相同。

【讨论】:

    【解决方案3】:

    联合是垂直的,连接是水平的。也许需要这样的东西。

    MariaDB [sandbox]> create table stk(ITEMID varchar(10), STOCK int);
    Query OK, 0 rows affected (0.20 sec)
    
    MariaDB [sandbox]> insert into stk values
        -> ('Test1' ,  10),
        -> ('Test2' ,  15),
        -> ('Test3' ,  12);
    Query OK, 3 rows affected (0.02 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    MariaDB [sandbox]>
    MariaDB [sandbox]> drop table if exists qty;
    Query OK, 0 rows affected (0.14 sec)
    
    MariaDB [sandbox]> create table qty(ITEMID varchar(10), DOCDATE varchar(10)  , QTY int);
    Query OK, 0 rows affected (0.20 sec)
    
    MariaDB [sandbox]> insert into qty values
        -> ('Test1' ,  '2/28/2017' , 5),
        -> ('Test2' ,  '2/28/2017' , 8),
        -> ('Test3' ,  '2/28/2017' , 6),
        -> ('Test1' ,  '3/28/2017' , 7),
        -> ('Test2' ,  '3/28/2017' , 7),
        -> ('Test3' ,  '3/28/2017' , 7);
    Query OK, 6 rows affected (0.01 sec)
    Records: 6  Duplicates: 0  Warnings: 0
    
    MariaDB [sandbox]>
    MariaDB [sandbox]> select s.itemid,s.stock,
        ->  q.docdate,sum(q.qty) qty
        -> from stk s
        -> join qty q on q.itemid = s.itemid
        -> group by s.itemid,s.stock,q.docdate
        -> order by q.docdate, s.itemid,s.stock
        ->
        -> ;
    +--------+-------+-----------+------+
    | itemid | stock | docdate   | qty  |
    +--------+-------+-----------+------+
    | Test1  |    10 | 2/28/2017 |    5 |
    | Test2  |    15 | 2/28/2017 |    8 |
    | Test3  |    12 | 2/28/2017 |    6 |
    | Test1  |    10 | 3/28/2017 |    7 |
    | Test2  |    15 | 3/28/2017 |    7 |
    | Test3  |    12 | 3/28/2017 |    7 |
    +--------+-------+-----------+------+
    6 rows in set (0.00 sec)
    

    【讨论】:

      【解决方案4】:

      使用JOIN 获取结果:

      SELECT ITEMID ,STOCK,DOCDATE,QTY
      FROM table1
      JOIN table2 ON table1.ITEMID = table2.ITEMID
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        相关资源
        最近更新 更多