2017-05-05 52 views
2
category Item Price 
    A  Pen  NULL 
    B  Pen  10 
    A  Pencil 10 
    B  Pencil 8 
    C  Pencil 7 
    A  Note Book 40 
    B  Note Book 30 
    C  Note Book 20 
    A  Bottle NULL 
    B  Bottle 80 
    A  Ball 50 
    B  Ball 40 
    A  Bag  1000 
    B  Bag  800 

这是我的数据,我想只显示A类数据,如果A的价格为null 然后显示B类的价格。我试过,但不知道我是如何显示 数据如何使用情况后,凡在SQL Server的条款

select * from tbl1 
where category = case when price is null then 'B' else 'A' end 

当运行这个查询是只显示A类数据

category Item Price 
A   Pencil 10 
A   Note Book 40 
A   Ball  50 
A   Bag  1000 
+1

输出应该如何? –

+0

你到目前为止尝试过什么? –

回答

0

使用left joincoalesce()(你也可以使用isnull()):

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' 

coalesce()将返回第一个非null值从参数按顺序从左到右。

rextester演示:http://rextester.com/FZO89906

回报:

+----------+-----------+-------+ 
| Category | Item | Price | 
+----------+-----------+-------+ 
| A  | Pen  | 10 | 
| A  | Pencil | 10 | 
| A  | Note Book | 40 | 
| A  | Bottle | 80 | 
| A  | Ball  | 50 | 
| A  | Bag  | 1000 | 
+----------+-----------+-------+ 

参考:

1

像这样

SELECT price 
FROM table 
WHERE 
    category = CASE 
      WHEN price is not null THEN 'A' 
      ELSE 'B' 
      END 

`

+0

这里的问题在于,当考虑“B”行时,他们试图对“A”行进行“推理”。当考虑是否在结果中包含“B”行时,他们希望'价格'列的值来自'A'行。它不能用一个简单的'WHERE'条件来完成。 –

0
;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 

输出对于value'B”

category Item  Price 
-------------------------------- 
B   Pencil  8 
B   Pen   10 
B   Note Book 30 
B   Ball  40 
B   Bottle  80 
B   Bag   800 
0

我把它理解为如果在一个项目类别有一个零价格它应该从另一个类别拿起具体项目有价格

--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