WAQ 以动态方式代表销售代表的季度销售额(使用 Pivot)

WAQ to represents SalesRep with their quater sales dynamically(Using Pivot)

编写查询以按以下方式列出销售代表及其销售额(输出中的列)

SalesRep Name, City, Q1Sales, Q2Sales, Q3Sales, Q4Sales, QAvg, YearSales

Where QAvg = (Q1 Sales + Q2 Sales + Q3 Sales + Q4 Sales) / 4
And YearSales = Q1 Sales + Q2 Sales + Q3 Sales + Q4 Sales

表格内容:

SalesRep    
--------------------------------------
 column name | data type | constraint
--------------------------------------
 Id          | Int       | PK
 Name        | Varchar   |
 City        | Varchar   |    


SampleData
--------------------------
 Id | Name    | City
--------------------------
 1  | Agent A | Chennai
 2  | Agent B | Delhi
 3  | Agent C | Pune
 4  | Agent D | Bangalore
 5  | Agent E | Patna


Sales
-----------------------------------------------------
 column name | data type     | constraint
-----------------------------------------------------
 SalesRepId  | Int           |  FK to Salesrep table
 QtrId       | Int           |  FK to Qtr table
 Sales       | Numeric(10,2) |


Sample Data
----------------------------
 SalesRepId | QtrId | Sales
----------------------------
 1          | 1     | 1000
 1          | 2     | 2500
 2          | 1     | 3450
 2          | 2     | 4300
 2          | 3     | 230
 2          | 4     | 1367
 4          | 3     | 500
 4          | 4     | 750
 5          | 4     | 450


Qtr
--------------------------------------
 column name | date type | constraint
--------------------------------------
 QtrId       | Int       | PK
 Desc        | varchr2   |


Sample Data
-------------------
  QtrId | Desc1
-------------------
   1    | Q1 FY 14
   2    | Q2 FY 14
   3    | Q3 FY 14
   4    | Q4 FY 14

我是通过使用 pivot 实现的,但我的查询不是动态的。我必须让它动态化,但是怎么做?

我的查询是:

SELECT name, city, 
       "Q1 FY 14", "Q2 FY 14", "Q3 FY 14", "Q4 FY 14", 
       qavg, year_sales
  FROM (SELECT ID, name, qtrid, sales, city
          FROM salesrep
          left outer join sales
            on salesrep.id=sales.salesrepid)
 PIVOT ( 
     sum(sales) for
          qtrid IN (1 AS "Q1 FY 14",
                    2 AS "Q2 FY 14",
                    3 AS "Q3 FY 14",
                    4 AS "Q4 FY 14") 
 ) T1
LEFT OUTER JOIN  ( select SALESREPID, 
                          sum(sales)/count(distinct qtrid) as qavg,
                          SUM(SALES) AS year_sales
                     FROM SALES 
                    GROUP BY SALESREPID
                 ) T2
ON T1.ID = T2.SALESREPID;
select year, id, name, city, q1, q2, q3, q4,
    (nvl(q1, 0)+nvl(q2, 0)+nvl(q3, 0)+nvl(q4, 0)) 
      / (nvl2(q1,1,0)+nvl2(q2,1,0)+nvl2(q3,1,0)+nvl2(q4,1,0)) s_avg,
    (nvl(q1, 0)+nvl(q2, 0)+nvl(q3, 0)+nvl(q4, 0)) / 4 s_avg4,
    nvl(q1, 0)+nvl(q2, 0)+nvl(q3, 0)+nvl(q4, 0) s_sum
  from (
    select substr(q.descr, 1, 2) qtr, substr(q.descr, 7, 2) year, 
           sr.id, sr.name, sr.city, s.sales
      from salesrep sr join sales s on s.salesrepid = sr.id 
      join qtr q on q.qtrid = s.qtrid)
  pivot (sum(sales) for qtr in ('Q1' Q1, 'Q2' Q2, 'Q3' Q3, 'Q4' Q4))
  order by year, id

==============================================================================

YEAR ID NAME       CITY          Q1    Q2    Q3    Q4    S_AVG   S_AVG4  S_SUM
---- -- ---------- ---------- ----- ----- ----- ----- -------- -------- ------
14    1 Agent A    Chennai     1000  2500                 1750      875   3500
14    2 Agent B    Delhi       3450  4300   230  1367  2336,75  2336,75   9347
14    4 Agent D    Bangalore                500   750      625    312,5   1250
14    5 Agent E    Patna                          450      450    112,5    450
15    1 Agent A    Chennai     4455                       4455  1113,75   4455

1) 您的部分问题是:其中 QAvg = (Q1 Sales + Q2 Sales + Q3 Sales + Q4 Sales) / 4。我认为您应该始终除以 4 - 就像我对列 S_AVG4 所做的那样。但是,如果您想除以 sales 之和不为空的季度数,则使用 S_AVG.

列的语法

2) 在 SQL 查询中,解析时必须知道列数。动态解决方案有 PLSQL 解决方法,我已经在评论中发布了 link。