Sql 对于这种情况,是否可以使用组合子查询?
我目前正在尝试优化这个超长查询。我考虑过组合子查询,但在有约束的情况下,我无法获得一个查询中每个组的计数 是否可以缩小以下查询Sql 对于这种情况,是否可以使用组合子查询?,sql,oracle,optimization,subquery,Sql,Oracle,Optimization,Subquery,我目前正在尝试优化这个超长查询。我考虑过组合子查询,但在有约束的情况下,我无法获得一个查询中每个组的计数 是否可以缩小以下查询 SELECT val_year, spg, SUM(val_q1) val_q1, SUM(val_q2) val_q2, SUM(val_q3) val_q3, SUM(val_q4) val_q4, SUM(val_q1) + SUM(val_q2) + SUM(val_q3) + SUM(val_q4) va
SELECT
val_year,
spg,
SUM(val_q1) val_q1,
SUM(val_q2) val_q2,
SUM(val_q3) val_q3,
SUM(val_q4) val_q4,
SUM(val_q1) + SUM(val_q2) + SUM(val_q3) + SUM(val_q4) val_total
FROM (
SELECT
val_year,
spg,
count_prods val_q1,
0 val_q2,
0 val_q3,
0 val_q4
FROM table_report
WHERE val_quarter = 'Q1'
UNION ALL
SELECT
val_year,
spg,
0 val_q1,
count_prods val_q2,
0 val_q3,
0 val_q4
FROM table_report
WHERE val_quarter = 'Q2'
UNION ALL
SELECT
val_year,
spg,
0 val_q1,
0 val_q2,
count_prods val_q3,
0 val_q4
FROM table_report
WHERE val_quarter = 'Q3'
UNION ALL
SELECT
val_year,
spg,
0 val_q1,
0 val_q2,
0 val_q3,
count_prods val_q4
FROM table_report
WHERE val_quarter = 'Q4'
)
表u报告如下所示:
table_report:
val_year VARCHAR2(4)
spg VARCHAR2(256)
val_quarter VARCHAR2(2)
count_prods NUMBER(10)
SELECT
val_year,
spg,
val_q1,
val_q2,
val_q3,
val_q4,
val_q1 + val_q2 + val_q3 + val_q4 as val_total
FROM (
SELECT
val_year,
spg,
sum(case when val_quarter = 'Q1' then count_prods else 0 end) as val_q1,
sum(case when val_quarter = 'Q2' then count_prods else 0 end) as val_q2,
sum(case when val_quarter = 'Q3' then count_prods else 0 end) as val_q3,
sum(case when val_quarter = 'Q4' then count_prods else 0 end) as val_q4
FROM table_report
GROUP BY val_year, spg
)
您可以使用以下事例将联合替换为单个查询:
SELECT
val_year,
spg,
CASE WHEN val_quarter = 'Q1' THEN count_prods ELSE 0 END val_q1,
CASE WHEN val_quarter = 'Q2' THEN count_prods ELSE 0 END val_q2,
CASE WHEN val_quarter = 'Q3' THEN count_prods ELSE 0 END val_q3,
CASE WHEN val_quarter = 'Q4' THEN count_prods ELSE 0 END val_q4
FROM table_report
您可以使用以下事例将联合替换为单个查询:
SELECT
val_year,
spg,
CASE WHEN val_quarter = 'Q1' THEN count_prods ELSE 0 END val_q1,
CASE WHEN val_quarter = 'Q2' THEN count_prods ELSE 0 END val_q2,
CASE WHEN val_quarter = 'Q3' THEN count_prods ELSE 0 END val_q3,
CASE WHEN val_quarter = 'Q4' THEN count_prods ELSE 0 END val_q4
FROM table_report
根据我的理解,您可以直接使用group by query来获取每个季度的总和计数- 像
选择sumcount_prods mysum、val_quarter作为季度分组 根据我的理解,您可以直接使用group by query获得每个季度的总和计数- 像
选择sumcount_prods mysum、val_quarter作为季度分组 它看起来像一个PIVOT查询,因此您可以在一个数据库中完成所有操作
SELECT
val_year, spg,
coalesce(q1_total, 0) as q1,
coalesce(q2_total, 0) as q2,
coalesce(q3_total, 0) as q3,
coalesce(q4_total, 0) as q4,
coalesce(q1_total, 0) + coalesce(q2_total, 0) + coalesce(q3_total, 0) + coalesce(q4_total, 0) as total
FROM
(SELECT val_Year, spg, count_prod, val_quarter FROM test)
PIVOT (SUM(count_prod) as total
FOR (val_Quarter) IN ('Q1' AS q1, 'Q2' AS q2, 'Q3' AS q3, 'Q4' as q4))s ;
请参见它看起来像一个PIVOT查询,因此您可以一次完成所有操作
SELECT
val_year, spg,
coalesce(q1_total, 0) as q1,
coalesce(q2_total, 0) as q2,
coalesce(q3_total, 0) as q3,
coalesce(q4_total, 0) as q4,
coalesce(q1_total, 0) + coalesce(q2_total, 0) + coalesce(q3_total, 0) + coalesce(q4_total, 0) as total
FROM
(SELECT val_Year, spg, count_prod, val_quarter FROM test)
PIVOT (SUM(count_prod) as total
FOR (val_Quarter) IN ('Q1' AS q1, 'Q2' AS q2, 'Q3' AS q3, 'Q4' as q4))s ;
请参见我不确定您想要得到什么样的结果,但也许您可以尝试以下方法:
table_report:
val_year VARCHAR2(4)
spg VARCHAR2(256)
val_quarter VARCHAR2(2)
count_prods NUMBER(10)
SELECT
val_year,
spg,
val_q1,
val_q2,
val_q3,
val_q4,
val_q1 + val_q2 + val_q3 + val_q4 as val_total
FROM (
SELECT
val_year,
spg,
sum(case when val_quarter = 'Q1' then count_prods else 0 end) as val_q1,
sum(case when val_quarter = 'Q2' then count_prods else 0 end) as val_q2,
sum(case when val_quarter = 'Q3' then count_prods else 0 end) as val_q3,
sum(case when val_quarter = 'Q4' then count_prods else 0 end) as val_q4
FROM table_report
GROUP BY val_year, spg
)
这是一个没有数据的问题:我不确定你想要得到什么样的结果,但也许你可以尝试这样的方法:
table_report:
val_year VARCHAR2(4)
spg VARCHAR2(256)
val_quarter VARCHAR2(2)
count_prods NUMBER(10)
SELECT
val_year,
spg,
val_q1,
val_q2,
val_q3,
val_q4,
val_q1 + val_q2 + val_q3 + val_q4 as val_total
FROM (
SELECT
val_year,
spg,
sum(case when val_quarter = 'Q1' then count_prods else 0 end) as val_q1,
sum(case when val_quarter = 'Q2' then count_prods else 0 end) as val_q2,
sum(case when val_quarter = 'Q3' then count_prods else 0 end) as val_q3,
sum(case when val_quarter = 'Q4' then count_prods else 0 end) as val_q4
FROM table_report
GROUP BY val_year, spg
)
这是一个没有数据的问题:查询试图做什么?创建一个年度总结,包括每年的季度和每个spg。等等,我在办公室有一个任务。我想到了一件事,我会在一段时间内对它进行评论。这个问题想做什么?创建一个年度总结,包括每年的季度和每个spg。等等,我在办公室有一个任务。我想到了一件事,我会在一段时间内对其进行评论。你甚至可以将SUM/CASE移到主查询吗?@jarlh:你可以将所有内容合并到一个查询中,但是valu q?值被多次使用,然后您需要复制该案例。我想如果你保留派生表,代码会更干净些。我在想克劳斯写的一个分组。你甚至不能将总和/大小写移动到主查询吗?@jarlh:你可以将所有内容合并到一个查询中,但是val\u q?值被多次使用,然后您需要复制该案例。如果保留派生表,那么代码会更干净。我在想一个由Clause创建的组。出于显示原因,我需要选择每个季度。对于每个季度,结果中将有一行。他帮不上忙?我想他想要什么还不清楚。但答案确实优化了代码。我确实认为group by子句也是可能的。出于显示原因,我需要选择每个季度。对于每个季度,结果中将有一行。他帮不上忙?我想他想要什么还不清楚。但答案确实优化了代码。我确实认为GROUPBY子句也可能是PIVOT的性能比使用SUMCASE更快…'Q1’?可能差不多,你可以看看执行计划。读老了,但是…:PIVOT的性能是否比使用SUMCASE更快Q1’?可能差不多,你可以看看执行计划。读老了,但是…: