5

我在SQL Fiddle中定义了这个 sql 表和行

SUPPLIER_DETAILS表中有一个名为IS_PAYABLE的字段,其值为 null 或“Y”。

如果,则每个PRODUCT_REGIS_PAYABLE='Y'可能有一个或多个记录,但PRODUCT_NO不同。例如,有两条记录。PRODUCT_REG = 'HP_C20'IS_PAYABLE='Y'

HP_C20  FR-A    GB-A128     Y
HP_C20  FR-A    GB-A098     Y

我想要的是,如果一个PRODUCT_REGIS_PAYABLE='Y'有多个记录,那么我只想要其中一个记录,并且我想要所有记录。IS_PAYABLE is null

我怎样才能做到这一点?如果我没有使我的要求易于理解,我将进一步解释。

任何帮助都是非常可观的。

谢谢

4

4 回答 4

5
select * from 
   (select a.*, 
         row_number() over (partition by product_reg order by product_no) as rnk 
   from SUPPLIER_DETAILS a
   order by PRODUCT_REG)
where is_payable is null or rnk = 1;

SQLFIDDLE

在内部查询中,我对具有相同 product_reg 的产品进行了排名。

在外部查询中,每个 product_reg(排名第一)和所有非应付产品只有一个产品。

于 2012-09-19T12:25:03.213 回答
3

试试这个:

SELECT s.* 
FROM   supplier_details s 
WHERE  NOT EXISTS(SELECT s1.* 
                  FROM   supplier_details s1 
                  WHERE  s.is_payable = 'Y' 
                         AND s1.is_payable = 'Y' 
                         AND s.product_reg = s1.product_reg 
                         AND s.product_no < s1.product_no) 
UNION 
SELECT * 
FROM   supplier_details 
WHERE  is_payable IS NULL 

http://sqlfiddle.com/#!4/25c52/2/0

编辑:下面的代码也应该工作(联合是多余的)

SELECT s.* 
FROM   supplier_details s 
WHERE  NOT EXISTS(SELECT s1.* 
                  FROM   supplier_details s1 
                  WHERE  s.is_payable = 'Y' 
                         AND s1.is_payable = 'Y' 
                         AND s.product_reg = s1.product_reg 
                         AND s.product_no < s1.product_no) 

http://sqlfiddle.com/#!4/5e69b/1/0

于 2012-09-19T12:29:05.843 回答
3

在这种情况下row_number(),分析功能将派上用场。

   select product_reg
        , product_supplier_code
        , product_no
        , is_payable
     from (select t.*
                , row_number() over (partition by product_reg order by product_no) m
             from SUPPLIER_DETAILS t
          )
    where m = 1
       or is_payable is null
    order by product_reg

演示#1

此外

似乎是重复的。为了在此处稍微区分答案,您可以使用另一种方法来获得所需的结果

select product_reg
    , max(PRODUCT_SUPPLIER_CODE) KEEP (DENSE_RANK FIRST ORDER BY product_reg) PRODUCT_SUPPLIER_CODE
    , max(PRODUCT_NO) KEEP (DENSE_RANK FIRST ORDER BY product_reg) PRODUCT_NO
    , max(IS_PAYABLE) KEEP (DENSE_RANK FIRST ORDER BY product_reg) IS_PAYABLE
from SUPPLIER_DETAILS t
group by product_reg 
order by product_reg

演示#2

于 2012-09-19T12:30:03.083 回答
2

您可以使用UNION ALL它,但是在返回记录时where IS_PAYABLE = 'Y'使用聚合总是返回MAX()orMIN()

select PRODUCT_REG, PRODUCT_SUPPLIER_CODE, max(PRODUCT_NO) PRODUCT_NO, IS_PAYABLE
from SUPPLIER_DETAILS
where IS_PAYABLE = 'Y'
group by  PRODUCT_REG, PRODUCT_SUPPLIER_CODE, IS_PAYABLE
union all 
select PRODUCT_REG, PRODUCT_SUPPLIER_CODE, PRODUCT_NO, IS_PAYABLE
from SUPPLIER_DETAILS
where IS_PAYABLE is null
order by PRODUCT_REG

请参阅带有演示的 SQL Fiddle

于 2012-09-19T13:03:18.463 回答