如何在sql server中使用where子句之后的case
这是我的数据。如果价格为空,我只想显示A类数据 然后显示B类价格。我试过了,但不知道我是怎么表现出来的 资料 运行此查询时,只显示A类数据如何在sql server中使用where子句之后的case,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这是我的数据。如果价格为空,我只想显示A类数据 然后显示B类价格。我试过了,但不知道我是怎么表现出来的 资料 运行此查询时,只显示A类数据 select * from tbl1 where category = case when price is null then 'B' else 'A' end 使用左连接和合并()(也可以使用isnull()): coalesce()将按从左到右的顺序返回参数中的第一个非null值 rextester演示: 返回: select a.Category,
select * from tbl1
where category = case when price is null then 'B' else 'A' end
使用
左连接和合并()
(也可以使用isnull()
):
coalesce()
将按从左到右的顺序返回参数中的第一个非null
值
rextester演示:
返回:
select a.Category, a.Item, coalesce(a.Price,b.Price) as Price
from yourtable a
left join yourtable b
on a.Item = b.Item
and b.category = 'B'
where a.category = 'A'
参考:
类似这样的东西
+----------+-----------+-------+
| Category | Item | Price |
+----------+-----------+-------+
| A | Pen | 10 |
| A | Pencil | 10 |
| A | Note Book | 40 |
| A | Bottle | 80 |
| A | Ball | 50 |
| A | Bag | 1000 |
+----------+-----------+-------+
`
输出
;WITH cte(category,Item,Price)
AS
(
SELECT 'A','Pen' ,NULL UNION ALL
SELECT 'B','Pen' ,10 UNION ALL
SELECT 'A','Pencil' ,10 UNION ALL
SELECT 'B','Pencil' ,8 UNION ALL
SELECT 'C','Pencil' ,7 UNION ALL
SELECT 'A','Note Book' ,40 UNION ALL
SELECT 'B','Note Book' ,30 UNION ALL
SELECT 'C','Note Book' ,20 UNION ALL
SELECT 'A','Bottle' ,NULL UNION ALL
SELECT 'B','Bottle' ,80 UNION ALL
SELECT 'A','Ball' ,50 UNION ALL
SELECT 'B','Ball' ,40 UNION ALL
SELECT 'A','Bag' ,1000 UNION ALL
SELECT 'B','Bag' ,800
)
SELECT category,Item,Price From
(
SELECT *,ROW_NUMBER()Over(Partition by Price order by Price)seq From
(
SELECT o.* FROM cte i
INNER JOIN cte o
ON o.category=i.category
WHERE o.category='A' AND o.Price!=i.Price
)dt
) Final
where Final.seq=1
值“B”的输出
category Item Price
A Pencil 10
A Note Book 40
A Ball 50
A Bag 1000
我的理解是,如果某个类别中的某个项目的价格为空,那么它应该从另一个有价格的类别中选取该特定项目
输出应该是什么样的?这里的问题是,当考虑B
行时,他们试图对A
行进行“推理”。在考虑是否在结果中包含B
行时,他们希望price
列的值来自A
行。这不能用一个简单的WHERE
条件来完成。
SELECT price
FROM table
WHERE
category = CASE
WHEN price is not null THEN 'A'
ELSE 'B'
END
;WITH cte(category,Item,Price)
AS
(
SELECT 'A','Pen' ,NULL UNION ALL
SELECT 'B','Pen' ,10 UNION ALL
SELECT 'A','Pencil' ,10 UNION ALL
SELECT 'B','Pencil' ,8 UNION ALL
SELECT 'C','Pencil' ,7 UNION ALL
SELECT 'A','Note Book' ,40 UNION ALL
SELECT 'B','Note Book' ,30 UNION ALL
SELECT 'C','Note Book' ,20 UNION ALL
SELECT 'A','Bottle' ,NULL UNION ALL
SELECT 'B','Bottle' ,80 UNION ALL
SELECT 'A','Ball' ,50 UNION ALL
SELECT 'B','Ball' ,40 UNION ALL
SELECT 'A','Bag' ,1000 UNION ALL
SELECT 'B','Bag' ,800
)
SELECT category,Item,Price From
(
SELECT *,ROW_NUMBER()Over(Partition by Price order by Price)seq From
(
SELECT o.* FROM cte i
INNER JOIN cte o
ON o.category=i.category
WHERE o.category='A' AND o.Price!=i.Price
)dt
) Final
where Final.seq=1
category Item Price
A Pencil 10
A Note Book 40
A Ball 50
A Bag 1000
category Item Price
--------------------------------
B Pencil 8
B Pen 10
B Note Book 30
B Ball 40
B Bottle 80
B Bag 800
--Filter records having prices
with CTETable as
(
Select distinct category, item, price
from tbl1
where price is not null
)
--distinct items
select * from
(select category, item, price, ROW_NUMBER() over (Partition by Item order by
Category) as RowNo from CTETable)
as c
where c.RowNo=1