1

table_cを生成できるクエリはどれですか?

day、person、revenue_per_person の 3 つの列があります。table_bを生成するときに 'person' を失うため、現在 2 つのクエリを使用する必要があります。

table_aは 3 つの列すべてを使用します。

SELECT day, person, revenue_per_person
FROM purchase_table
GROUP BY day, person

AVG() と GROUP BY により、table_bは 2 つの列のみを使用します。

SELECT day, AVG(revenue) as avg_revenue
FROM purchase_table
GROUP BY day

table_atable_bから作成されたtable_c :

SELECT 
   CASE 
   WHEN revenue_per_person > avg_revenue THEN 'big spender'
   ELSE 'small spender'
   END as spending_bucket
FROM ????
4

3 に答える 3

1

たぶんこれが役立つかもしれません、これを試してください

SELECT a.day,
    CASE 
        WHEN a.revenue_per_person > b.avg_revenue THEN 'big spender'
        ELSE 'small spender'
   END as spending_bucket
FROM
    (
        SELECT day, person, AVG(revenue) revenue_per_person
        FROM purchase_table
        GROUP BY day, person
    ) a INNER JOIN
    (
        SELECT day, AVG(revenue) as avg_revenue
        FROM purchase_table
        GROUP BY day
    ) b ON a.day = b.day
于 2012-09-11T00:53:33.403 に答える
0

分析関数を使用することもできます。個人の給与がその部門の平均給与よりも高いかどうかを示す Oracle の例。

08:56:54 HR@vm_xe> ed                                                     
Wrote file s:\toolkit\service\buffer.sql                                  

  1  select                                                               
  2    department_id                                                      
  3    ,employee_id                                                       
  4    ,salary                                                            
  5    ,avg_salary                                                        
  6    ,case when salary > avg_salary then 1 else 0 end case_is_greater   
  7  from (                                                               
  8    select                                                             
  9       department_id                                                   
 10      ,employee_id                                                     
 11      ,salary                                                          
 12      ,round(avg(salary) over(partition by department_id),2) avg_salary
 13    from employees                                                     
 14  )                                                                    
 15* where department_id = 30                                             
08:58:56 HR@vm_xe> /                                                      

DEPARTMENT_ID EMPLOYEE_ID     SALARY AVG_SALARY CASE_IS_GREATER           
------------- ----------- ---------- ---------- ---------------           
           30         114      11000       4150               1           
           30         115       3100       4150               0           
           30         116       2900       4150               0           
           30         117       2800       4150               0           
           30         118       2600       4150               0           
           30         119       2500       4150               0           

6 rows selected.                                                          

Elapsed: 00:00:00.01
于 2012-09-11T01:00:02.353 に答える
0

Windows 機能をサポートするデータベースを使用している場合は、次のように実行できます。

SELECT (CASE WHEN revenue_per_person > avg_revenue THEN 'big spender'
             ELSE 'small spender'
        END) as spending_bucket
FROM (select pt.*,
             avg(revenue) over (partition by day, person) as revenue_per_person,
             avg(revenue) over (partition by day) as avg_revenue,
             row_number() over (partition by day, person order by day) as seqnum
      from purchase_table pt
     ) t
where seqnum = 1

seqnum の目的は、人/日の組み合わせごとに 1 つの行を取得することです。

于 2012-09-11T01:02:51.793 に答える