如果存在多个数据,请在select语句中组合列

时间:2015-07-13 07:36:03

标签: sql oracle group-by

我有一个要求,我有一个如下所示的选择语句:

SELECT t1.a,t2.b,t2.c FROM t1,t2 WHERE t1.d = t2.e group by a,b;

我正在提取专栏'b'并将其与专栏'a'分组。但是,对于t2列的一个计数,表t1.a中的行数可以是多个,并且t2.b在每种情况下都可以不同。 因此,对于t1.a的一次计数,如果有多个t2.b,我希望它显示为“MULTIPLE”,否则,它应显示t2.b的值

我希望我的问题很明确。 提前谢谢,

Anoop

我的查询:

select prh.requisition_header_id,
case when count(prl.suggested_vendor_name)>1 THEN 'MULTIPLE' ELSE prl.suggested_vendor_name END suggested_vendor_name
from PO_REQ_DISTRIBUTIONS_ALL prd,PO.PO_REQUISITION_LINES_ALL prl, gl_code_combinations gcc,fnd_flex_values_vl f1,
fnd_flex_values_vl f2,PO_REQUISITION_HEADERS_ALL prh,PER_ALL_PEOPLE_F papf
where prd.requisition_line_id = prl.requisition_line_id
and prl.requisition_header_id = prh.requisition_header_id
AND PAPF.PERSON_ID = PRL.TO_PERSON_ID 
AND TRUNC(SYSDATE) BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE
and gcc.code_combination_id = prd.CODE_COMBINATION_ID
and gcc.segment1 = f1.flex_value
and gcc.segment2 = f2.flex_value
and f1.flex_value_set_id = 1
and f2.flex_value_set_id = 2
and prh.AUTHORIZATION_STATUS IN('APPROVED','IN PROCESS')
and prh.preparer_id = 35016
group by prh.requisition_header_id,gcc.segment1,gcc.segment2,f2.description,prh.requisition_header_id,
papf.full_name ,prl.suggested_vendor_name;

4 个答案:

答案 0 :(得分:1)

我能找到的最接近的方法是下面说明的方法。请注意,我已删除您发布的所有样板文件以提高可读性。

select case 
         when vendors.vendorsqty > 1 then 'MULTIPLE'
         else (select suggested_vendor_name 
                 from po_requisition_lines_all
                where requisition_header_id = vendors.headerid)
       end
  from (select prh.requisition_header_id headerid,
               count(prl.suggested_vendor_name) vendorsqty
          from PO_REQUISITION_HEADERS_ALL  prh,      
               PO_REQUISITION_LINES_ALL    prl
         where prl.requisition_header_id = prh.requisition_header_id
         group by prh.requisition_header_id) vendors;

答案 1 :(得分:0)

我不确定你想要完成什么。您是否尝试将t1.a列中的所有值分组为一个字符串?然后你使用CONCAT(GROUP_CONCAT(t1.a),GROUP_CONCAT(t2.b))或者你只想连接两个值?如果是这样,你使用CONCAT(t1.a,t2.b)

答案 2 :(得分:0)

尝试类似:

SELECT t1.a,CASE WHEN COUNT(t2.b) > 1 THEN "MULTIPLE" ELSE t2.b END FROM t1 INNER JOIN t2 
ON t1.d = t2.e 
GROUP BY t1.a;
  • 不鼓励隐式加入

答案 3 :(得分:0)

感谢回复人员,

最终的答案包括以下逻辑:

decode(count(distinct prl.suggested_vendor_name) over (partition by prh.requisition_header_id),1,prl.suggested_vendor_name,0,null,'MULTIPLE')
vendor

我使用partition by对供应商进行分组,并使用decode来显示所需的结果