2 qq 20560653 qq_20560653 于 2015.07.18 23:05 提问

SQL求取部分数据,如何实现

如下图,已有表a与表b的数据,如何通过SQL语句变成表c?表a是UserName相同时,根据Month降序汇总Salary数据;表b是UserName对应SumSalary的上限值;表c是从表a中取出表b上限值以下的分录,若分录的SumSalary值大于b表的Salary,则拆分出刚好汇总等于b表的Salary数。
图片说明
表A的SQL语句:
create table User_Salary (UserName nvarchar(200), Month nvarchar(20), Salary int)
go
insert into User_Salary (UserName,Month,Salary ) values('AAA','2010/12',1000)
insert into User_Salary (UserName,Month,Salary ) values('AAA','2011/01',2000)

insert into User_Salary (UserName,Month,Salary ) values('AAA','2011/02',3000)

insert into User_Salary (UserName,Month,Salary ) values('BBB','2010/12',2000)

insert into User_Salary (UserName,Month,Salary ) values('BBB','2011/01',2500)

insert into User_Salary (UserName,Month,Salary ) values('BBB','2011/02',2500)

insert into User_Salary (UserName,Month,Salary ) values('CCC','2013/12',5000)

insert into User_Salary (UserName,Month,Salary ) values('CCC','2013/04',4000)

insert into User_Salary (UserName,Month,Salary ) values('CCC','2013/02',3000)

4个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.07.19 00:22
已采纳
 SELECT username,MONTH,Salary2 salary,SumSalary2 sumsalary FROM (
SELECT k.*,case when b.flag1=0 then -1 else b.flag1 end flag2
,case when B.flag1=1 and k.flag1<>1 then k.salary-(k.SumSalary-k.maxSalary) else k.salary end Salary2
,case when B.flag1=1 and k.flag1<>1 then k.maxSalary else k.SumSalary end SumSalary2   FROM   
(SELECT A.*,row_number() OVER(order by UserName,month desc) r  FROM 
(SELECT a.*,case when maxSalary>SumSalary then 1 when maxSalary=SumSalary then 0 else -1 end flag1 from(
select u.*
,(select SUM(salary) from User_Salary where User_Salary.Month>=u.month and User_Salary.UserName = u.userName) as SumSalary
,(select Salary from b where b.UserName = u.UserName) as maxSalary
from User_Salary u 
) a )A
) k 
LEFT JOIN 
(SELECT A.*,row_number() OVER(order by UserName,month desc) r FROM 
(SELECT a.*,case when maxSalary>SumSalary then 1 when maxSalary=SumSalary then 0 else -1 end flag1 from (
select u.*
,(select SUM(salary) from User_Salary where User_Salary.Month>=u.month and User_Salary.UserName = u.userName) as SumSalary
,(select Salary from b where b.UserName = u.UserName) as maxSalary
from User_Salary u 
) a )A
) B   
on k.R = B.R+1  
) a WHERE FLAG1=1 OR FLAG1 = 0 OR FLAG2 = 1
qq_20560653
qq_20560653 谢谢
接近 3 年之前 回复
devmiao
devmiao   Ds   Rxr 2015.07.18 23:23

先group by分组,再join b表去比较判断。

qq_22886617
qq_22886617   2015.07.18 23:24

使用视图吧,如果不会,那就用楼上所说的做

strutce
strutce   Ds   Rxr 2015.07.19 11:39

insert into c select a.usernaem,a.mouth,b.salary,a.sumSalary from a,b where a.username=b.username and a.sumSalary<b.salary
你给出的c结果有问题

qq_20560653
qq_20560653 C结果就是要把Sumsalary与B的salary的值一致
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
[SQL] 只更新表中某一部分数据的实现方法
(1)只更新表中前10条数据(更新为固定值) (2)用一个表的字段值更新另一个表的某字段值 (3)更新表前10条数据(更新为另一个表的数据)
在SQL SERVER中实现事务的部分回滚
在SQL SERVER中实现事务的部分回滚1.保存点:是一种实现部分回滚的方法。可以给一个保存点起一个名字,以便在后面的事务中可以回滚到保存点。 2.实现代码。BEGIN TRANSACTION Transaction_Name<br />SQL_Statement1<br />SQL_Statement2    SAVE TRANSACTION Save_Name --设置保存点   SQL_Statement3<br />SQL_Statement4IF Test_Condition_Fails   
sql 如何提取某一字段记录的部分数据
今天写程序,需要提取查询出来的记录的部分数据,使用JAVA可以实现,然后考虑sql方法是否也有同样的函数可供调用呢?查看了一下sql server2000 帮助文档,在字符串函数下找到了这个方法,原来方法名和java的相同,只不过传递的参数意义不同而已。sql 中的类似方法是substring(字段名,开始索引,字符串长度)例:select substring(q_time,1,4
SQL查询部分数据表中部分数据
虽然SQL是一套标准化的语言,但是由于市场上给个厂家生产的数据库并不完全统一,因此在不同数据库中的数据中SQL的编写就不一样。在此总结了部分数据库查询表中部分数据的SQL。 1. ORACLE SELECT * FROM TABLE1 WHERE ROWNUM HQL: from table1 t order by t.createTime desc where rownum 2.
如何导出数据库的一张表里面的部分数据?
转载地址:http://blog.csdn.net/chengtong_java/article/details/52807054mysql中导出指定条件的数据mysqldump -u用户名 -p密码 -h mysql主机  --default-character-set=指定编码  数据库名称  表名称  --where=&quot; 查询条件 &quot; &amp;gt; 导出文件名.sqlmysqldump -uro...
用Apache Spark进行大数据处理——第二部分:Spark SQL
在Apache Spark文章系列的前一篇文章中,我们学习了什么是Apache Spark框架,以及如何用该框架帮助组织处理大数据处理分析的需求。 Spark SQL,作为Apache Spark大数据框架的一部分,主要用于结构化数据处理和对Spark数据执行类SQL的查询。通过Spark SQL,可以针对不同格式的数据执行ETL操作(如JSON,Parquet,数据库)然后完成特定的查询操
怎样将Excel中的某一部分字段内容导入到SQL Server 2000的某个表的某些字段中
 很简单,使用opendatasource就可以实现了insert into tablenameselect * from opendatasource(Microsoft.Jet.OLEDB.4.0,Data Source="excel文件的具体位置";Extended properties=Excel 5.0)...Sheet名$ 
求取两个数的最大公约数
之前我也实现过最大公约数的求解,采用了一种近乎穷举的方式来实现的。一次坐火车的时候带着高德纳的《计算机编程艺术》第一卷看了下,英语退步的厉害没有看懂太多东西,倒是看到了一个求取最大公约数的算法。看完之后,一下子觉得自己之前的算法是多么差。        下面使用Python简单进行一下算法实现: defCommDevisor(m,n):        r = m % n        wh
SQL更新某字段中的部分值语句
SQL更新某字段中的部分值语句: Update tableName SET columeName = REPLACE(columeName, 'a', 'b')
特征值和特征向量的求取方法
1. Jacobi迭代法