这种情况下是否可以使用组合子查询?

Is a combined subquery possible for this scenario?

我目前正在尝试优化这个长查询。我查看了组合子查询,但在有约束条件的情况下,我无法获得一个查询中每个组的计数。

是否可以精简以下查询?

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'
)

table_report 看起来像这样:

table_report:
val_year VARCHAR2(4)
spg VARCHAR2(256)
val_quarter VARCHAR2(2)
count_prods NUMBER(10)

您可以使用 CASE 将 UNION 替换为单个查询:

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得到每个季度的sum count -

喜欢

select sum(count_prods) mysum, val_quarter as quarter group by 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 ;

SqlFiddle

我不确定你想要得到什么结果,但也许你可以尝试这样的方法:

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
)

这是一个无数据 fiddle : http://sqlfiddle.com/#!4/9bf262/20