SELECT Records> 0 и со значениями NO NULL - PullRequest
0 голосов
/ 14 июня 2019

У меня есть запрос, в котором я выдаю результаты со строками, которые содержат 0 значений.Я хотел бы исключить все строки, в которых столбцы B или C = 0. Чтобы исключить такие строки, я добавил T2.A <> 0 и T2.A! = 0. При этом значения 0 заменяются наЗначения NULL.Таким образом, я также добавил T2.A NOT NULL.

В моих результатах все еще отображаются столбцы, которые мне не нужны, которые показывают (null) и хотели бы исключить их.

SELECT
  (SELECT  
      SUM(T2.A) as prem
      FROM Table_2 T2, Table_2 T1
      WHERE T2.ENT_REF = T1.ENT_REF
      AND UPPER(T2.PER) = 'HURR' 
      AND UPPER(T2.ENT_TYPE) = 'POL'
      AND T2.Cov NOT IN ('OUTPROP','COV')
      AND T2.A <> 0
      AND T2.A IS NOT NULL
  ) as B,
  (SELECT  
      SUM(T2.A) as prem
      FROM Table_2 T2, Table_2 T1
      WHERE T2.ENT_REFE = T1.ENT_REF 
      AND UPPER(T2.PER) IN ('I', 'II', 'II') 
      AND UPPER(T2.ENT_TYPE) = 'POL'
      AND T2.Cov NOT IN ('OUTPROP','COV')
      AND T2.A <> 0
      AND T2.A IS NOT NULL
  ) as C

В идеале результат будет выглядеть следующим образом:

+----+--------+--------+
| ID |  B     |   C    |  
+----+--------+--------+
|  1 |   24   |  123   |  
|  2 |   65   |   78   |  
|  3 |   43   |   89   |  
|  3 |    0   |    0   |  
|  4 |   95   |   86   |  
|  5 |   43   |   65   |  
|  5 | (null) | (null) |  
+----+--------+--------+

К чему-то похожему на следующее:


+----+-----+-----+
| ID |  B  |  C  |  
+----+-----+-----+
|  1 |  24 | 123 |  
|  2 |  65 |  78 |  
|  3 |  43 |  89 |   
|  4 |  95 |  86 |  
|  5 |  43 |  65 |  
+----+-----+-----+

Я также пытался использовать разные значения, но яесть другие столбцы, такие как даты, которые отличаются для каждой строки.Хотя мне нужно включать даты, они не так важны для меня, как получение столбцов B и C только со значениями> 0. Я также попытался использовать оператор GROUP BY ID, но я получаю ошибку, которая сообщает «ORA-00979»:не выражение GROUP BY '

Ответы [ 3 ]

0 голосов
/ 14 июня 2019

Вы записали все условия в предложении SELECT.

Вы столкнулись с проблемой, потому что предложение WHERE определяет количество извлекаемых строк, а предложение SELECT решает, что значения должны бытьвозвращено.

В вашем случае происходит что-то вроде следующего:

Простой пример:

-- MANUAL DATA
WITH DATAA AS (
    SELECT
        1 KEY,
        'VALS' VALUE,
        1 SEQNUM
    FROM
        DUAL
    UNION ALL
    SELECT
        2,
        'IDEAL OPTION',
        2
    FROM
        DUAL
    UNION ALL
    SELECT
        10,
        'EXCLUDE',
        3
    FROM
        DUAL
)
-- QUERY OF YOUR TYPE
SELECT
    (
        SELECT
            KEY
        FROM
            DATAA I
        WHERE
            I.KEY = 1
            AND O.KEY = I.KEY
    ) AS KEY, -- DECIDE VALUES TO BE SHOWN
    (
        SELECT
            KEY
        FROM
            DATAA I
        WHERE
            I.SEQNUM = 1
            AND O.SEQNUM = I.SEQNUM
    ) AS SEQNUM -- DECIDE VALUES TO BE SHOWN
FROM
    DATAA O
WHERE
    O.KEY <= 2; -- DECIDES THE NUMBER OF RECORDS

ВЫХОД:

output

Если вы не хотите сильно менять логику в своем запросе, просто используйте дополнительное предложение WHERE вне вашего окончательного запроса, например:

SELECT <bla bla bla>
FROM <YOUR FINAL QUERY>
WHERE B IS NOT NULL AND C IS NOT NULL

Ура !!

0 голосов
/ 14 июня 2019

Если я правильно понимаю ваш запрос, было бы гораздо проще и эффективнее избежать поиска в предложении Select.Попробуйте собрать все это в одном запросе:

SELECT * FROM (
SELECT T2.ENT_REF AS ID,
       SUM(CASE WHEN UPPER(T2.PER) = 'HURR' THEN T2.A END) AS B,
       SUM(CASE WHEN UPPER(T2.PER) IN ('I', 'II', 'II') THEN T2.A END) as C
  FROM Table_2 T2
  WHERE UPPER(T2.ENT_TYPE) = 'POL'
    AND T2.Cov NOT IN ('OUTPROP','COV')
  GROUP BY T2.ENT_REF
)
WHERE B IS NOT NULL
   OR C IS NOT NULL
0 голосов
/ 14 июня 2019

Я думаю, вы были на правильном пути, пытаясь сгруппировать значения.

Чтобы сделать это, столбцы (которые должны быть различны) будут оставлены в покое (например, ID в следующем примере), а остальные должны быть агрегированы (используя min, max или любой другой, который вы считаете подходящим).

Например, как вы сказали, что есть какой-то столбец даты, который вас не волнует - я имею в виду, какой из них вы выберете, - затем выберите первый (т.е. min(date_column)). Точно так же, как и с остальными. Предложение group by должно содержать все неагрегированные столбцы (id в этом примере).

select id, 
       sum(a) a, 
       sum(b) b, 
       min(date_column) date_column
from your_current_query
group by id
...