ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2699|回复: 12

[求助] 一个SQL查询问题(超复杂)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-10-2 23:20 | 显示全部楼层 |阅读模式
本帖最后由 fire2009 于 2012-10-3 22:26 编辑

表格说明:
1、SS表与WM表“日期”列和”客户ID”列完全相同;
2、现金A+现金B=总现金。
问题求解:
查询5月份<2000AND6月份<2000AND7月份<2000AND8月份>=200(同时满足)的客户ID,并查询这些客户ID在8月份大于或等于200时的总现金与日期。
(以上数字均为总现金)
例如:客户ID"XX"在5~8月消费分别为152、652、784、349,它在8月25日(1~25号)累加消费201,故客户ID"XX"在8月份大于或等于200时的总现金为201,所求日期为8月25日。
数据表格.rar (36.79 KB, 下载次数: 16)


TA的精华主题

TA的得分主题

发表于 2012-10-3 00:23 | 显示全部楼层
[code=sql];with a as
(
  select * from ss
    union all
  select * from wm
),
b as
(
  select MONTH([date]) as [month],[id],SUM([money]) as [money_sum]
  from a
  where MONTH([date]) in (5,6,7)
  group by MONTH([date]),[id]
  having SUM([money]) < 2000
),
c as
(
  select [date],[id],[money],
   (select SUM(money)
    from a as x
    where x.[id] = y.[id]
    and MONTH([date]) = 8
    and x.[date] <= y.[date]) as [money_sum]
  from a as y
)
select MIN(c.[date]) as [date],c.id,c.money_sum
from b
join c
on b.id = c.id
where c.money_sum >= 200
group by c.id,c.money_sum
order by MIN(c.[date]),c.id
/*
date                    id                     money_sum
----------------------- ---------------------- ----------------------
2012-08-03 00:00:00.000 2                      269.26
2012-08-03 00:00:00.000 5                      205.14
2012-08-03 00:00:00.000 7                      261.44
2012-08-03 00:00:00.000 9                      3709.25
2012-08-03 00:00:00.000 16                     309.41
2012-08-03 00:00:00.000 18                     255.77
2012-08-04 00:00:00.000 3                      268.5866
2012-08-04 00:00:00.000 6                      324.3486
2012-08-04 00:00:00.000 7                      271.61
2012-08-04 00:00:00.000 14                     274.88
2012-08-04 00:00:00.000 16                     400.01
2012-08-04 00:00:00.000 18                     319.06
2012-08-05 00:00:00.000 2                      279.2577
2012-08-05 00:00:00.000 7                      281.61
2012-08-05 00:00:00.000 9                      3782.98
2012-08-05 00:00:00.000 10                     322.14
2012-08-05 00:00:00.000 12                     242.2175
2012-08-05 00:00:00.000 16                     498.95
2012-08-05 00:00:00.000 18                     493.42
2012-08-06 00:00:00.000 2                      330.6377
2012-08-06 00:00:00.000 3                      406.2566
2012-08-06 00:00:00.000 5                      215.14
2012-08-06 00:00:00.000 7                      345.64
2012-08-06 00:00:00.000 9                      3825.23
2012-08-06 00:00:00.000 12                     281.7575
2012-08-06 00:00:00.000 14                     394.91
2012-08-06 00:00:00.000 16                     651.0686
2012-08-06 00:00:00.000 17                     218.0783
2012-08-06 00:00:00.000 18                     558.79
2012-08-07 00:00:00.000 2                      381.9777
2012-08-07 00:00:00.000 3                      433.2866
2012-08-07 00:00:00.000 6                      483.4486
2012-08-07 00:00:00.000 7                      408.59
2012-08-07 00:00:00.000 10                     378.44
2012-08-07 00:00:00.000 12                     400.2475
2012-08-07 00:00:00.000 16                     792.0986
2012-08-07 00:00:00.000 18                     662.59
2012-08-08 00:00:00.000 2                      433.8377
2012-08-08 00:00:00.000 3                      581.7266
2012-08-08 00:00:00.000 7                      478.75
2012-08-08 00:00:00.000 14                     404.01
2012-08-08 00:00:00.000 16                     868.3169
2012-08-08 00:00:00.000 18                     815.73
2012-08-08 00:00:00.000 20                     281.4823
2012-08-09 00:00:00.000 2                      543.0377
2012-08-09 00:00:00.000 3                      708.5366
2012-08-09 00:00:00.000 7                      544.87
2012-08-09 00:00:00.000 13                     238.3661
2012-08-09 00:00:00.000 14                     404.5
2012-08-09 00:00:00.000 16                     949.6269
2012-08-09 00:00:00.000 18                     963.55
2012-08-10 00:00:00.000 2                      683.0077
2012-08-10 00:00:00.000 3                      726.8266
2012-08-10 00:00:00.000 5                      270.88
2012-08-10 00:00:00.000 7                      607.06
2012-08-10 00:00:00.000 10                     430.67
2012-08-10 00:00:00.000 12                     462.9475
2012-08-10 00:00:00.000 14                     405.49
2012-08-10 00:00:00.000 16                     1010.2769
2012-08-10 00:00:00.000 17                     2138.9883
2012-08-10 00:00:00.000 18                     1052.81
2012-08-10 00:00:00.000 20                     335.9023
...

(285 行受影响)
*/
[/code]

TA的精华主题

TA的得分主题

发表于 2012-10-3 00:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
[code=sql];with a as
(
  select * from ss
    union all
  select * from wm
),
b as
(
  select MONTH([date]) as [month],[id],SUM([money]) as [money_sum]
  from a
  where MONTH([date]) in (5,6,7)
  group by MONTH([date]),[id]
  having SUM([money]) < 2000
),
c as
(
  select [date],[id],[money],
   (select SUM(money)
    from a as x
    where x.[id] = y.[id]
    and MONTH([date]) = 8
    and x.[date] <= y.[date]) as [money_sum]
  from a as y
),
d as
(
  select c.[date],c.id,c.money_sum
  from b
  join c
  on b.id = c.id
  where c.money_sum >= 200
)
select MIN([date]) as [date],id
from d
group by id
/*
date                    id
----------------------- ----------------------
2012-08-15 00:00:00.000 1
2012-08-03 00:00:00.000 2
2012-08-04 00:00:00.000 3
2012-08-15 00:00:00.000 4
2012-08-03 00:00:00.000 5
2012-08-04 00:00:00.000 6
2012-08-03 00:00:00.000 7
2012-08-03 00:00:00.000 9
2012-08-05 00:00:00.000 10
2012-08-05 00:00:00.000 12
2012-08-09 00:00:00.000 13
2012-08-04 00:00:00.000 14
2012-08-03 00:00:00.000 16
2012-08-06 00:00:00.000 17
2012-08-03 00:00:00.000 18
2012-08-13 00:00:00.000 19
2012-08-08 00:00:00.000 20

(17 行受影响)
*/
[/code]

TA的精华主题

TA的得分主题

发表于 2012-10-3 00:46 | 显示全部楼层
[code=sql];with a as
(
  select * from ss
    union all
  select * from wm
),
b as
(
  select MONTH([date]) as [month],[id],SUM([money]) as [money_sum]
  from a
  where MONTH([date]) in (5,6,7)
  group by MONTH([date]),[id]
  having SUM([money]) < 2000
),
c as
(
  select [date],[id],[money],
   (select SUM(money)
    from a as x
    where x.[id] = y.[id]
    and MONTH([date]) = 8
    and x.[date] <= y.[date]) as [money_sum]
  from a as y
),
d as
(
  select c.[date],c.id,c.money_sum
  from b
  join c
  on b.id = c.id
  where c.money_sum >= 200
)
select MIN([date]) as [date],id,MIN(money_sum) as money_sum
from d
group by id
/*

date                    id                     money_sum
----------------------- ---------------------- ----------------------
2012-08-15 00:00:00.000 1                      216.5011
2012-08-03 00:00:00.000 2                      269.26
2012-08-04 00:00:00.000 3                      268.5866
2012-08-15 00:00:00.000 4                      343.736
2012-08-03 00:00:00.000 5                      205.14
2012-08-04 00:00:00.000 6                      324.3486
2012-08-03 00:00:00.000 7                      261.44
2012-08-03 00:00:00.000 9                      3709.25
2012-08-05 00:00:00.000 10                     322.14
2012-08-05 00:00:00.000 12                     242.2175
2012-08-09 00:00:00.000 13                     238.3661
2012-08-04 00:00:00.000 14                     274.88
2012-08-03 00:00:00.000 16                     309.41
2012-08-06 00:00:00.000 17                     218.0783
2012-08-03 00:00:00.000 18                     255.77
2012-08-13 00:00:00.000 19                     247.75
2012-08-08 00:00:00.000 20                     281.4823

(17 行受影响)
*/[/code]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-3 11:24 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-10-3 12:59 | 显示全部楼层
a:两表合并
b:5,6,7月份分组合计,筛选出<2000的记录
c:8月份连续聚合
d:b,c两表关联

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-3 17:25 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-3 17:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
好像结果跟实际有点偏差。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-4 11:09 | 显示全部楼层
amazeyeli 发表于 2012-10-3 12:59
a:两表合并
b:5,6,7月份分组合计,筛选出

请说明X,Y具体代表什么,有什么作用,数据在附件。谢谢
  1. ;with a as( select * from ss union all select * from wm),b as( select MONTH([date]) as [month],[id],SUM([money]) as [money_sum] from a where MONTH([date]) in (5,6,7) group by MONTH([date]),[id] having SUM([money]) < 2000),c as( select [date],[id],[money], (select SUM(money) from a as x where x.[id] = y.[id] and MONTH([date]) = 8 and x.[date] <= y.[date]) as [money_sum] from a as y),d as( select c.[date],c.id,c.money_sum from b join c on b.id = c.id where c.money_sum >= 200)select MIN([date]) as [date],id,MIN(money_sum) as money_sumfrom dgroup by id/*date id money_sum----------------------- ---------------------- ----------------------2012-08-15 00:00:00.000 1 216.50112012-08-03 00:00:00.000 2 269.262012-08-04 00:00:00.000 3 268.58662012-08-15 00:00:00.000 4 343.7362012-08-03 00:00:00.000 5 205.142012-08-04 00:00:00.000 6 324.34862012-08-03 00:00:00.000 7 261.442012-08-03 00:00:00.000 9 3709.252012-08-05 00:00:00.000 10 322.142012-08-05 00:00:00.000 12 242.21752012-08-09 00:00:00.000 13 238.36612012-08-04 00:00:00.000 14 274.882012-08-03 00:00:00.000 16 309.412012-08-06 00:00:00.000 17 218.07832012-08-03 00:00:00.000 18 255.772012-08-13 00:00:00.000 19 247.752012-08-08 00:00:00.000 20 281.4823(17 行受影响)*/
复制代码

TA的精华主题

TA的得分主题

发表于 2012-10-4 19:04 | 显示全部楼层
x,y是随便取的一个别名
这段代码是T-SQL语句,在Exel中未必能执行
提供的是一个思路,仅供参考
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-7 08:21 , Processed in 0.027731 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表