zoukankan      html  css  js  c++  java
  • LeetCode 【困难】数据库-第1384 :按照年度列出销售总额(每个产品、每年、总销额)

    题目

    dayofyear (date) :会得出该日期距离该年份最早那一天的天数。

    dayofmonth(date) :会得出该日期距离本份最早那一天的天数。

    dayofweek (date) :返回日期的工作日索引值,即星期日为1,星期一为2,星期六为7。

    数据

    结果

    解答

    1.先设计一张表---需要统计的年份及各年份的天数

    select '2018' year, 365 days_of_year
        union all 
    select '2019' year, 365 days_of_year
        union all 
    select '2020' year, 366 days_of_year
    

    2.计算总额

    s.average_daily_sales 
    * 
    (
    if(year(s.period_end) > y.year, y.days_of_year, dayofyear(s.period_end)) 
    - 
    if(year(s.period_start) < y.year, 1, dayofyear(s.period_start)) 
    +1
    ) results
    

    3. 连接两表、计算天数和总金额。

    select  
    	*,
    	(if(year(s.period_end) > y.year, y.days_of_year, dayofyear(s.period_end)) - if(year(s.period_start) < y.year, 1, dayofyear(s.period_start)) + 1) 1_total_amount,
    	if(year(s.period_end) > y.year, y.days_of_year, dayofyear(s.period_end)) 2_ends,
    	if(year(s.period_start) < y.year, 1, dayofyear(s.period_start))  3_starts,
    	s.average_daily_sales * (if(year(s.period_end) > y.year, y.days_of_year, dayofyear(s.period_end)) - if(year(s.period_start) < y.year, 1, dayofyear(s.period_start)) +1)  4_results			
    from Sales s
    inner join
    (
        select '2018' year, 365 days_of_year
        union all select '2019' year, 365 days_of_year
        union all select '2020' year, 366 days_of_year
    ) y
    

    4.连接条件

    select  
    	*,
    	(if(year(s.period_end) > y.year, y.days_of_year, dayofyear(s.period_end)) - if(year(s.period_start) < y.year, 1, dayofyear(s.period_start)) + 1) 1_total_amount,
    	if(year(s.period_end) > y.year, y.days_of_year, dayofyear(s.period_end)) 2_ends,
    	if(year(s.period_start) < y.year, 1, dayofyear(s.period_start))  3_starts,
    	s.average_daily_sales * (if(year(s.period_end) > y.year, y.days_of_year, dayofyear(s.period_end)) - if(year(s.period_start) < y.year, 1, dayofyear(s.period_start)) +1)  4_results			
    from Sales s
    inner join
    (
        select '2018' year, 365 days_of_year
        union all select '2019' year, 365 days_of_year
        union all select '2020' year, 366 days_of_year
    ) y
    on year(s.period_start) <= y.year and year(s.period_end) >= y.year
    

    5.关联产品表,匹配产品名。排序

    
    select  
    	s.product_id,  #
    	p.product_name,  #
    	y.year report_year, 
    	s.average_daily_sales * (if(year(s.period_end) > y.year, y.days_of_year, dayofyear(s.period_end)) - if(year(s.period_start) < y.year, 1, dayofyear(s.period_start)) +1)  4_results			
    from Sales s
    inner join
    (
        select '2018' year, 365 days_of_year
        union all select '2019' year, 365 days_of_year
        union all select '2020' year, 366 days_of_year
    ) y
    on year(s.period_start) <= y.year and year(s.period_end) >= y.year
    inner join Product p
    on p.product_id = s.product_id
    order by s.product_id, y.year;
    

  • 相关阅读:
    Permutation Test 置换检验
    计算机会议排名等级
    国际顶级计算机会议
    机器学习中的范数规则化 L0、L1与L2范数 核范数与规则项参数选择
    岭回归(Ridge Regression)
    popupWindow使用timePicker时点击出现闪屏问题的解决办法
    Java:单例模式的七种写法
    JSONObject遍历获取键值方法合并两个JSONObject
    解决android studio上“com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65935”问题
    解决同时共用MOB公司的shareSDK和SMSSDK的冲突问题
  • 原文地址:https://www.cnblogs.com/Tdazheng/p/14987180.html
Copyright © 2011-2022 走看看