子查询使用来自外部查询的未分组列"i.date_time"

luc*_*ert 5 sql subquery

我有两个表:item_status_log和items.items表具有itemid,status和ordertype列.item_status_log表具有itemid,date_time,new_status和old_status.基本上,当在我的程序中更改状态时,会在item_status_log中记录一条记录,其中包含旧状态,新状态和date_time.

我想要的是能够查看按更新日期分组的项目表.我有以下sql工作完美:

select to_char(date_time, 'MM-DD-YYYY') as "Shipment Date", count(*) as "TOTAL Items"
from item_status_log i where old_status = 'ONORDER' 
group by "Shipment Date" 
order by "Shipment Date" desc
Run Code Online (Sandbox Code Playgroud)

这给了我

Shipment Date  |   TOTAL Items
------------------------------
09/02/2014     |   4
09/01/2014     |   23
Run Code Online (Sandbox Code Playgroud)

但是,我想在上面的表中添加2列,它会分解"INVENTORY"和"ORDER"的items表中有多少项具有状态.

我在找这个:

 Shipment Date  |   TOTAL Items  |  Inventory   |  Ordered 
 ---------------------------------------------------------
 09/02/2014     |   4            |        3     |      1
 09/01/2014     |   23           |       20     |      3
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试,但获取'子查询使用未分组的列"i.date_time"来自外部查询'错误

select to_char(date_time, 'MM-DD-YYYY') as "Shipment Date", count(*) as "TOTAL Items",
(select count(*) from item_status_log t 
where date(t.date_time) = date(i.date_time) and itemid in (select itemid 
from items where  ordertype = 'ORDER')) as "Customer",
(select count(*) from item_status_log t 
where date(t.date_time) = date(i.date_time) and itemid in (select itemid 
from items where  ordertype = 'INVENTORY')) as "Inventory"
from item_status_log i where old_status = 'ONORDER' 
group by "Shipment Date" 
order by "Shipment Date" desc
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

我认为您只需要条件聚合:

select to_char(date_time, 'MM-DD-YYYY') as "Shipment Date", count(*) as "TOTAL Items",
       sum(case when i.ordertype = 'ORDER' then 1 else 0 end) as NumOrders,
       sum(case when i.ordertype = 'INVENTORY' then 1 else 0 end) as NumInventory
from item_status_log il join
     items i
     on il.itemid = i.itemid
where old_status = 'ONORDER' 
group by "Shipment Date" 
order by "Shipment Date" desc;
Run Code Online (Sandbox Code Playgroud)