Sql server 按多个位置的和()进行筛选
我需要构建一个查询,返回order\u ID按SUM(函数)过滤 假设我只需要在“笔”、“铅笔”和“橡皮擦”之和等于或大于15时过滤下面的数据。换句话说,我需要排除“stamp”和“frames”。我想我需要按订单号分组Sql server 按多个位置的和()进行筛选,sql-server,group-by,sum,filtering,Sql Server,Group By,Sum,Filtering,我需要构建一个查询,返回order\u ID按SUM(函数)过滤 假设我只需要在“笔”、“铅笔”和“橡皮擦”之和等于或大于15时过滤下面的数据。换句话说,我需要排除“stamp”和“frames”。我想我需要按订单号分组 order_ID |article_ID | QTY | ---------------------------- 1 | pen | 5 | 1 | pencil | 5 | 1 | eraser |
order_ID |article_ID | QTY |
----------------------------
1 | pen | 5 |
1 | pencil | 5 |
1 | eraser | 5 |
1 | stamp | 3 |
1 | frames | 3 |
2 | pen | 3 |
2 | pencil | 5 |
2 | eraser | 5 |
3 | pen | 5 |
3 | pencil | 10 |
我希望只得到订单_ID=1,因为2和3都不符合我的条件。你能帮我吗?聚合后过滤应该可以
SELECT order_id FROM t
WHERE article_id IN( "pen", "pencil", "eraser" )
GROUP BY order_id
HAVING SUM(QTY)>=15
您可以使用条件聚合,如下所示:
Select order_id from #yourorder group by order_id
having sum(case when article_id in ('pen','pencil','eraser') then qty else 0 end) >= 15
根据您的输入,将返回订单id 1和3,不仅返回订单id 1 仅当“笔”、“铅笔”和“橡皮擦”之和等于或大于 15岁以上 作为下一个演示:-
Create table mytable (order_ID int , article_ID varchar(20),QTY int)
insert into mytable values
(1,'pen',5),
(1,'pencil',5),
(1,'eraser',5),
(1,'stamp',3),
(1,'frames',3),
(2,'pen',3),
(2,'pencil',5),
(2,'eraser',5),
(3,'pen',5),
(3,'pencil',10)
select order_ID,sum(QTY) SumQty
from mytable
WHERE article_id IN('pen','pencil','eraser' )
group by order_ID
having sum(QTY) => 15
输出:-
order_ID SumQty
1 15
3 15
为什么你不能得到订单号3,因为它的笔和铅笔=15?和Tab Alleman的评论一样。这是否意味着“笔”、“铅笔”和“橡皮擦”都必须有一个记录?