本人在刷SQL题的过程中遇到了一些困难,望解答(付费有偿,逻辑正确,必采纳。)

本人在刷SQL题的过程中遇到了一些困难,望解答(付费有偿,逻辑正确,必采纳。)

数据来源:题目所需字段
TYEAR(年份) TYEAR(月份) TAMOUNT(销量) 题目要求:
请用SQL查询输出每年每月的当月销量、当年累计销量、总累计销量,结果按时间从小到大排序,结果字段显示:年月、当月销量、当年累计销量、总累计销量


-- 请用SQL查询输出每年每月的当月销量、当年累计销量、总累计销量,结果按时间从小到大排序,结果字段显示:年月、当月销量、当年累计销量、总累计销量

表数据为:


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for 第1题_sql6
-- ----------------------------
DROP TABLE IF EXISTS `第1题_sql6`;
CREATE TABLE `第1题_sql6`  (
  `TYEAR` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `TMONTH` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `TAMOUNT` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of 第1题_sql6
-- ----------------------------
INSERT INTO `第1题_sql6` VALUES ('1996', '7', '2543.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '8', '9234.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '9', '3678.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '10', '4723.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '11', '3452.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '12', '8000.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '1', '5478.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '2', '5988.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '3', '3555.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '4', '6547.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '5', '7734.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '6', '1133.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '1', '3000.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '2', '2000.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '3', '3000.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '4', '7000.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '5', '7000.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '6', '8000.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '7', '3000.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '8', '2000.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '9', '3000.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '10', '7000.00');
INSERT INTO `第1题_sql6` VALUES ('1995', '11', '7000.00');
INSERT INTO `第1题_sql6` VALUES ('1996', '12', '2134.00');

SET FOREIGN_KEY_CHECKS = 1;

MS SQL的,参考一下:

img

望采纳

代码如下,使用left join关联

select
    s.TYEAR,
    s.TMONTH,
    s.TAMOUNT,
    t1.sumyear,/*年销量*/
    (select sum(s3.tamount) from sql6 s3 ) as sumall/*总销量*/
from
    sql6 s
    left join (select s2.tyear,sum(s2.tamount) as sumyear from sql6 s2 group by s2.tyear) t1
    on t1.tyear=s.TYEAR

其实SQL不难, 我觉得你还是选个几个月发个结果示例吧, 这样大家更好地理解你的需要, 还有就是这个SQL是mysql吗? 每种SQL写法还是有区别的

您可以使用以下SQL查询来实现您的需求:

WITH cte AS (
    SELECT DATE_FORMAT(sale_date, '%Y-%m') AS year_month, SUM(quantity) AS month_sale,
    SUM(SUM(quantity)) OVER (PARTITION BY DATE_FORMAT(sale_date, '%Y') ORDER BY DATE_FORMAT(sale_date, '%Y-%m')) AS year_sale,
    SUM(SUM(quantity)) OVER (ORDER BY DATE_FORMAT(sale_date, '%Y-%m')) AS total_sale
    FROM sales
    GROUP BY DATE_FORMAT(sale_date, '%Y-%m')
)
SELECT year_month, month_sale, year_sale, total_sale
FROM cte
ORDER BY year_month;


说明:

CTE (Common Table Expression) 是一种在一条SQL查询中可重用的结果集,可以减少复杂度和增加可读性。在这个查询中, CTE对记录分组,求月销量、年销量、累计销量。
DATE_FORMAT()函数将日期转换为指定格式的字符串。
SUM(SUM(quantity)) OVER (PARTITION BY DATE_FORMAT(sale_date, '%Y') ORDER BY DATE_FORMAT(sale_date, '%Y-%m'))用来累加年累计销量, SUM(SUM(quantity)) OVER (ORDER BY DATE_FORMAT(sale_date, '%Y-%m'))用来累加总累计销量.
在最后的查询中, 返回的结果集, 还是要按照年月排序。
注意: 在实际的应用中, 需要根据自己的数据库结构, 更改表名和字段名.

您可以使用以下SQL语句来完成此操作:

WITH sales_cte AS (
    SELECT TYEAR, TMONTH, SUM(TAMOUNT) AS month_sales,
           SUM(SUM(TAMOUNT)) OVER (PARTITION BY TYEAR ORDER BY TYEAR, TMONTH) as year_sales,
           SUM(SUM(TAMOUNT)) OVER () as total_sales
    FROM sales
    GROUP BY TYEAR, TMONTH
)

SELECT TYEAR || '-' || TMONTH AS "Year-Month", month_sales, year_sales, total_sales
FROM sales_cte
ORDER BY TYEAR, TMONTH;


这个语句使用一个名为 sales_cte 的通用表表达式(CTE)来组合每年每月的销售额。
CTE 中的第一个查询统计每个月和每年的销售总额,第二个查询使用 CTE 中的统计结果,并对结果进行排序。

其中,
TYEAR || '-' || TMONTH AS "Year-Month" 将年和月拼接
SUM(TAMOUNT) AS month_sales 求出每个月的销量
SUM(SUM(TAMOUNT)) OVER (PARTITION BY TYEAR ORDER BY TYEAR, TMONTH) as year_sales 以年为分组,求出每年的销量
SUM(SUM(TAMOUNT)) OVER () as total_sales 求出总销量

ORDER BY TYEAR, TMONTH 将结果按时间从小到大排序

请注意,上述语句假设您的表名为“sales”,并且有“TYEAR”,“TMONTH”和“TAMOUNT”字段。 您可能需要根据您的实际表结构进行修改。

这个题目需要使用到联表查询、子查询、排序等技巧。请看下面的SQL语句:

SELECT 
    TYEAR || '-' || TMONTH AS '年月', 
    SUM(CASE WHEN TYEAR = t.TYEAR AND TMONTH = t.TMONTH THEN TAMOUNT ELSE 0 END) AS '当月销量', 
    SUM(CASE WHEN TYEAR = t.TYEAR THEN TAMOUNT ELSE 0 END) AS '当年累计销量',
    SUM(TAMOUNT) AS '总累计销量'
FROM1题_sql6 t
GROUP BY TYEAR, TMONTH
ORDER BY TYEAR, TMONTH


这个语句中使用了联表查询,子查询和排序等技巧来实现题目要求。

联表查询:这里使用了一个表别名t来简化语句,并使用了SUM函数来求和。
子查询:使用了CASE语句来判断当前年份和月份是否与记录的年份和月份相同,如果相同则累加销量。
排序:使用ORDER BY语句来对结果按时间从小到大排序。
希望这个语句能够帮助你解决题目中的困难。如果你还有疑问,请继续问我。


select CONCAT(a.TYEAR,'-',a.TMONTH) as '年月',
a.TAMOUNT as '当月销量',
(select sum(TAMOUNT) from `第1题_sql6`
where a.TYEAR=TYEAR and a.TMONTH+0>=TMONTH+0) as '当年累计销量',
(SELECT sum(b.TAMOUNT) FROM `第1题_sql6` b 
where a.TYEAR+0>b.TYEAR+0 
or ( a.TYEAR=b.TYEAR and a.TMONTH+0>=b.TMONTH+0)) as '总累计销量'
from `第1题_sql6` a
order by a.TYEAR,a.TMONTH+0 asc

img