Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对于这种情况,是否可以使用组合子查询?_Sql_Oracle_Optimization_Subquery - Fatal编程技术网

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’?可能差不多,你可以看看执行计划。读老了,但是…: