检查使用nvl2与多个组by

时间:2018-03-07 11:59:08

标签: sql oracle group-by nvl

我有一张像

这样的表格
------------------------
S.No Name Amount Imp_Num
1     A    10     12345
2     B    20             
3     A    30      
4     C    40     4555
5     B    50
--------------------------

我想要像

这样的东西
---------------------------------------
Name Total_Amount  Imp_Num   Imp_Num_Present
 A      40          12345      Y
 B      70          null       N
 C      40          4555       Y
---------------------------------------

如果特定名称的重要数字至少存在一次并且应捕获重要数字,则important_number_present列应为Y.假定特定名称的重要数字是相同的。如果不同,最新的名称应显示为imp_numb。 (但这是次要的优先事项)。

我试过像

这样的东西
Select sum(amount) as total_amount, imp_num, nvl2(imp_num,'Y','N') from sampletable group by imp_num;

但是,如果没有名称,就无法检索名称,数据也没有意义。我可能会做一些完全错误的事情。可以在SQL中而不是在pl / sql中完成可行的解决方案。

group by with name返回带有null条目和imp_num条目的名称。

我正在解决这个问题。如果有人解决它会有很大的帮助。

提前致谢

2 个答案:

答案 0 :(得分:2)

您可以在imp_num上使用(假)聚合函数并按名称分组

[Arguments]    ${auditTrailFromState}    ${auditTrailToState}    ${auditTrailUser}
Run Keyword If    '${auditTrailFromState}'!='<n/a>'
...    Run Keywords
...    Define Auditing Event Queue
...    AND    Add Auditing Expectations    ${auditTrailFromState}    ${auditTrailToState}    ${auditTrailUser}
...    AND    Open Auditing Event Queue
...    AND    Verify Auditing Expectations

答案 1 :(得分:1)

编辑:具有COUNT功能的另一种解决方案。 DEMO

SELECT name
    ,SUM(amount) AS total_amount
    ,MAX(imp_num) AS Imp_Num
    ,CASE 
        WHEN Count(imp_num) > 0
            THEN 'Y'
        ELSE 'N'
        END AS Imp_Num_Present
FROM yourtable
GROUP BY name

您也可以使用MAX( CASE )

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE yourtable
    (S_No int, Name varchar2(1), Amount int, Imp_Num varchar2(5))
;

INSERT ALL 
    INTO yourtable (S_No, Name, Amount, Imp_Num)
         VALUES (1, 'A', 10, '12345')
    INTO yourtable (S_No, Name, Amount, Imp_Num)
         VALUES (2, 'B', 20, NULL)
    INTO yourtable (S_No, Name, Amount, Imp_Num)
         VALUES (3, 'A', 30, NULL)
    INTO yourtable (S_No, Name, Amount, Imp_Num)
         VALUES (4, 'C', 40, '4555')
    INTO yourtable (S_No, Name, Amount, Imp_Num)
         VALUES (5, 'B', 50, NULL)
SELECT * FROM dual
;

查询1

  SELECT Name,
         SUM (amount) AS total_amount,
         MAX (imp_num) AS Imp_Num,
         CASE
            WHEN MAX (CASE WHEN imp_num IS NOT NULL THEN 1 ELSE 0 END) = 1
            THEN
               'Y'
            ELSE
               'N'
         END
            AS Imp_Num_Present
    FROM yourtable
GROUP BY Name

<强> Results

| NAME | TOTAL_AMOUNT | IMP_NUM | IMP_NUM_PRESENT |
|------|--------------|---------|-----------------|
|    A |           40 |   12345 |               Y |
|    B |           70 |  (null) |               N |
|    C |           40 |    4555 |               Y |