本人在刷SQL题的过程中遇到了一些困难,望解答(付费有偿,逻辑正确,必采纳。)
数据来源:题目所需字段
TYEAR(年份) TYEAR(月份) TAMOUNT(销量) 题目要求:
请用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的,参考一下:
望采纳
代码如下,使用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 '总累计销量'
FROM 第1题_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