我有一个查询,其中要生成包含0值的行的结果。我想排除B或C列为0的任何行。要排除这样的行,我添加了T2.A <> 0和T2.A!=0。这样做时,0值替换为空值。因此,我还添加了T2.A IS NOT 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 |
+----+-----+-----+
我也尝试过使用不同的值,但是我还有其他列,例如日期,每行都不同。尽管我需要包括日期,但它们对我来说并不重要,仅使值仅大于0的B和C列成为可能。我也尝试使用GROUP BY ID语句,但收到一条错误消息,指出“ ORA-00979:不是GROUP BY表达式”
答案 0 :(得分:0)
我想您在正确的道路上,试图对值进行分组。
为此,列(应该是不同的)将被单独保留(如以下示例中的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
答案 1 :(得分:0)
您已在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
输出:
如果您不想在查询中更改太多逻辑,则只需在最终查询之外使用其他WHERE
子句,例如:
SELECT <bla bla bla>
FROM <YOUR FINAL QUERY>
WHERE B IS NOT NULL AND C IS NOT NULL
干杯!
答案 2 :(得分:0)
如果我理解您的查询正确,那么它将避免使用Select子句中的查询会更容易且性能更高。尝试将所有内容合并到一个查询中:
1s