Oracle SQL:SQL与group by(count)连接并具有子句
我有三张桌子 表1。出售 表2。项目服务 表3。项目 表1和表2有共同的ID,表2和表3有共同的项 我有一个问题,我已经提出了迄今为止,但似乎无法得到它的权利 我正在尝试选择只有一行且符合特定条件的所有行这是我的查询:Oracle SQL:SQL与group by(count)连接并具有子句,sql,oracle,group-by,having,Sql,Oracle,Group By,Having,我有三张桌子 表1。出售 表2。项目服务 表3。项目 表1和表2有共同的ID,表2和表3有共同的项 我有一个问题,我已经提出了迄今为止,但似乎无法得到它的权利 我正在尝试选择只有一行且符合特定条件的所有行这是我的查询: select * from sales i inner join itemssales j on i.id = j.id inner join item u on j.item = u.item where u.code = ANY ('TEST','HI') a
select *
from sales i
inner join itemssales j on i.id = j.id
inner join item u on j.item = u.item
where u.code = ANY ('TEST','HI') and
i.created_date between TO_DATE('1/4/2016 12:00:00 AM','MM/DD/YYYY HH:MI:SS AM') and
TO_DATE('1/4/2016 11:59:59 PM','MM/DD/YYYY HH:MI:SS PM')
group by i.id
having count(i.id) = 1
在ItemSale表中有两个条目,但在sale表中只有一个条目。这很好…但是我需要构造一个查询,它只返回给我一条记录
我认为问题在于任何部分,查询只返回一行,而该行是不符合任何“TEST”、“HI”条件的记录。
但实际上,具有该特定ID的记录在ItemSales中有两条记录
我只需要返回合法只有一条记录的记录
感谢您的帮助
--EDIT:
COL1 | ID
-----|-----
2 | 26
3 | 85
1 | 23
1 | 88
1 | 6
1 | 85
我还要对它们进行分组,确保计数等于1,但正如您所看到的,ID85在这里显示为一条记录,这是一个假阳性,因为itemsales表中实际上有两条记录
我甚至尝试在select之后将查询更改为j.id,因为j是包含两条记录的表,但没有go
--- EDIT
Sale table contains:
ID
---
85
Itemsales table contains:
ID | Position | item_id
---|----------|---------
85 | 1 | 6
85 | 2 | 7
Items table contains:
item_id | code
--------|------
7 | HI
6 | BOOP
它返回的记录是代码为“BOOP”的记录
谢谢
我只需要返回合法只有一条记录的记录
我的意思是,你只想退货一件商品。此外,您需要该项目以满足您的附加标准
这里有一种方法,它可以很好地处理少量数据,但可能无法很好地扩展。如果没有适当的表描述和数据配置文件,就不可能提供性能解决方案
with itmsal as
( select sales.id
from itemsales
join sales on sales.id = itemsales.id
where sales.created_date >= date '2016-01-04'
and sales.created_date < date '2016-01-05'
group by sales.id having count(*) = 1)
select sales.*
, item.*
from itmsal
join sales on sales.id = itmsal.id
join itemsales on itemsales.id = itmsal.id
join items on itemsales.item = itemsales.item
where items.code in ('TEST','HI')
我认为您试图限制结果,以便项目只能有“TEST”或“HI”代码
select
sales.*
from (
select
s.id
from Sales s
inner join Itemsales itss on s.id = itss.id
inner join Items i on itss.item_id = i.item_id
group by
s.id
where s.created_date >= date '2016-01-04'
and s.created_date < date '2016-01-05'
having
sum(case when i.code IN('TEST','HI') then 0 else 1 end) = 0
) x
inner join sales on x.id = sales.id
... /* more here as required */
此构造仅返回sales.id,其中包含仅包含这两个代码的项
注意,可以使用公共表表达式CTE来完成,但我更喜欢仅在这样做有好处时使用这些表达式,我在这里没有看到这一点。如果我正确获得它,则可能无法测试:
select *
from sales s
inner join (
select i.id, count( i.id ) as cnt
from sales i
inner join itemssales j on i.id = j.id
inner join item u on j.item = u.item and u.code IN ('TEST','HI')
where i.created_date between TO_DATE('1/4/2016 12:00:00 AM','MM/DD/YYYY HH:MI:SS AM') and
TO_DATE('1/4/2016 11:59:59 PM','MM/DD/YYYY HH:MI:SS PM')
group by i.id
) sj on s.id = sj.id and sj.cnt = 1
你能提供一个你目前获得的输出样本和你期望的结果吗?那么你想要的记录只有一种类型的代码吗?没错,但它不能在itemssales表中多次出现这是个诀窍,我认为上面的方法是行不通的。样本数据意味着所涉及的每个表的数据,你能提供一些请不要你现有的查询结果吗?基本上你要求的是只包含一个项目的所有销售?我认为你必须重新考虑你的问题。这确实令人困惑,可能会忽略相信、猜测的部分。说你试过的。您期望哪个输入有什么输出。