热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求一条SQL语句帮帮忙吧

3个表会员表客户ID会员ID会员类型ID部门ID注册日期会员类型表会员类型ID会员类型0为充值卡1为次数卡会员名字充值记录表会员ID金额充值的部门ID因为他们
3个表
会员表 客户ID 会员ID 会员类型ID 部门ID 注册日期
会员类型表 会员类型ID 会员类型0为充值卡1为次数卡  会员名字
充值记录表 会员ID 金额 充值的部门ID 
因为他们有6个店所有充值的时候要考虑这个卡是否卡段充值了
会员卡              数量     本店销售金额            跨店销售金额(会员卡充值)
学生卡              10             180.00                           0.00
会员卡储值       58        17650.00                      4160.00

我现在取不出数量,因为关联后会员表和充值表示一对多关系,一分组求count取出来的数量是充值次数而不是卖卡数量。然后我就分2次取,第一次取销售卡,本店充值,别的店在本店充值。 第2次取只取会员表取卖出去的卡数量。 然后2个结果插入临时表。
取会员卡, 本店销售金额,跨店销售金额
select b.VipName  VipName,sum(c.RechAmount) price,sum(isnull(d.RechAmount,0)) Kdprice from Customer a
left join VIpType b on a.vipno=b.vipno
left join RechargeRecord c on a.customerNo=c.customerNo  and a.deptno='010101' and c.DeptNo='010101'
left join RechargeRecord d on a.customerNo=d.customerNo  and a.deptno='010101' and d.DeptNo<>'010101'
where a.RegisterTime>='2016-02-23 00:00:00' and a.RegisterTime<'2016-03-09 00:00:00' and b.VipType=0 and c.RechAmount is not null
group by b.VipName order by b.VipName
取数量
select b.VipName,count(b.VipName) from Customer a
left join VIpType b on a.vipno=b.vipno
where a.RegisterTime>='2016-02-23 00:00:00' and a.RegisterTime<'2016-03-09 00:00:00' and b.VipType=0  and a.deptno='010101'
group by b.VipName order by b.VipName
 
 太麻烦了。 哪位大神能帮帮我

9 个解决方案

#1


试下这个,我没有测试数据,只能猜
 SELECT b.VipName  VipName,
COUNT(DISTINCT a.ID) AS 数量
SUM(CASE WHEN a.deptno = c.DeptNo THEN c.RechAmount ELSE 0 END) AS price,
SUM(CASE WHEN a.deptno <> c.DeptNo THEN c.RechAmount ELSE 0 END) AS Kdprice
FROM Customer a
left join VIpType b on a.vipno=b.vipno
left join RechargeRecord c on a.customerNo=c.customerNo 
WHERE a.deptno='010101'
GROUP BY b,VipName

#2


本帖最后由 roy_88 于 2016-03-15 14:34:49 编辑

如果要改写你最好表的栏位和表之间那些为一对多关系

结果集直接合并这样用

SELECT  b.VipName VipName
,e.VipCount
       ,SUM(c.RechAmount) price
       ,SUM(ISNULL(d.RechAmount , 0)) Kdprice
FROM    Customer a
        LEFT JOIN VIpType b ON a.vipno = b.vipno
        LEFT JOIN RechargeRecord c ON a.customerNo = c.customerNo
                                      AND a.deptno = '010101'
                                      AND c.DeptNo = '010101'
        LEFT JOIN RechargeRecord d ON a.customerNo = d.customerNo
                                      AND a.deptno = '010101'
                                      AND d.DeptNo <> '010101'
INNER JOIN (SELECT  b.VipName
   ,COUNT(b.VipName) AS VipCount
FROM    Customer a
LEFT JOIN VIpType b ON a.vipno = b.vipno
WHERE   a.RegisterTime >= '2016-02-23 00:00:00'
AND a.RegisterTime < '2016-03-09 00:00:00'
AND b.VipType = 0
AND a.deptno = '010101'
GROUP BY b.VipName) AS e ON e.VipName=b.VipName
WHERE   a.RegisterTime >= '2016-02-23 00:00:00'
        AND a.RegisterTime < '2016-03-09 00:00:00'
        AND b.VipType = 0
        AND c.RechAmount IS NOT NULL
GROUP BY b.VipName,e.VipCount
ORDER BY b.VipName;




改写一个,测一下结果是否正常

SELECT  b.VipName
,isnull(SUM(b.VipCount),0)  AS VipCount
,ISNULL(SUM(c.price) ,0) AS price
,isnull(SUM(c.Kdprice) ,0) AS Kdprice
FROM    Customer a
        LEFT JOIN (SELECT VipName,vipno,COUNT(*) AS VipCount FROM VIpType WHERE VipType = 0 GROUP BY VipName,vipno) AS  b ON a.vipno = b.vipno
        LEFT JOIN  (SELECT customerNo,DeptNo,SUM(CASE WHEN DeptNo = '010101' THEN RechAmount ELSE 0 END) AS price,SUM(CASE WHEN DeptNo != '010101' THEN RechAmount ELSE 0 END) AS Kdprice FROM RechargeRecord GROUP BY customerNo,DeptNo) AS c ON a.customerNo = c.customerNo
WHERE   a.RegisterTime >= '2016-02-23 00:00:00'
        AND a.RegisterTime < '2016-03-09 00:00:00'
GROUP BY b.VipName
ORDER BY b.VipName

#3


引用 1 楼 KanzakiOrange 的回复:
试下这个,我没有测试数据,只能猜
 SELECT b.VipName  VipName,
COUNT(DISTINCT a.ID) AS 数量
SUM(CASE WHEN a.deptno = c.DeptNo THEN c.RechAmount ELSE 0 END) AS price,
SUM(CASE WHEN a.deptno <> c.DeptNo THEN c.RechAmount ELSE 0 END) AS Kdprice
FROM Customer a
left join VIpType b on a.vipno=b.vipno
left join RechargeRecord c on a.customerNo=c.customerNo 
WHERE a.deptno='010101'
GROUP BY b,VipName


那怎么求合计啊。 我按照你说的改了下。 确实可以 但是没有办法 group by
   [type]
with rollup

#4


你能列出一下你想要的效果吗?我也猜不出你到底这个结果集要怎么弄?给点测试数据帮助理解

#5


引用 4 楼 KanzakiOrange 的回复:
你能列出一下你想要的效果吗?我也猜不出你到底这个结果集要怎么弄?给点测试数据帮助理解


就是这样

#6


引用 4 楼 KanzakiOrange 的回复:
你能列出一下你想要的效果吗?我也猜不出你到底这个结果集要怎么弄?给点测试数据帮助理解


我给你发图片了,你不在了么?

#7


我自己猜了点数据,你看下是不是这个效果

会员表 客户ID 会员ID 会员类型ID 部门ID 注册日期
CREATE TABLE #Member (ID INT,CusID INT,MemberID INT,DepaID VARCHAR(50),createdate DATETIME)
会员类型表 会员类型ID 会员类型0为充值卡1为次数卡  会员名字
CREATE TABLE #MemberType (MemberID INT,TypeID INT,MemName NVARCHAR(50))
充值记录表 会员ID 金额 充值的部门ID 
CREATE TABLE #Chongzhi (ID INT,MemberID INT,Amount MONEY,CashDepaID VARCHAR(50))

INSERT INTO #Member
        ( ID ,
          CusID ,
          MemberID ,
          DepaID ,
          createdate
        )
VALUES  ( 1 ,1 , 1 , '010101' ,'2016-03-01'),
( 2 ,2 , 2 , '010102' ,'2016-03-02'),
( 3 ,3 , 3 , '010102' ,'2016-02-01'),
( 4 ,4 , 4 , '010101' ,'2016-03-05')

INSERT INTO #MemberType
        ( MemberID, TypeID, MemName )
VALUES  ( 1,  0,  N'VIP卡'),
( 2,  0,  N'会员卡'),
( 3,  0,  N'金卡'),
( 4,  0,  N'银卡')

INSERT INTO #Chongzhi
        ( ID, MemberID ,Amount, CashDepaID )
VALUES  ( 1,1,310,'010101'),
( 2,2,200,'010102'),
( 3,3,506,'010101'),
( 4,4,150,'010102')

DECLARE @DepaID VARCHAR(50) = '010101'
SELECT  CASE WHEN GROUPING(b.MemName) = 1 THEN '合计' ELSE b.MemName END AS [会员卡名称],
COUNT((CASE WHEN a.DepaID = @DepaID THEN a.ID ELSE NULL END)) AS [售卡数],
SUM((CASE WHEN a.DepaID = @DepaID THEN c.Amount ELSE 0 END)) AS [本店销售],
SUM((CASE WHEN a.DepaID <> @DepaID THEN c.Amount ELSE 0 END)) AS [别店在本店销售]
FROM #Member a
INNER JOIN #MemberType b ON a.MemberID = b.MemberID 
LEFT JOIN #Chongzhi c ON a.MemberID = c.MemberID
WHERE a.createdate >= '2016-02-01'
  AND a.createdate < '2016-04-01'
  GROUP BY ROLLUP (b.MemName)

会员卡名称                                              售卡数         本店销售                  别店在本店销售
-------------------------------------------------- ----------- --------------------- ---------------------
VIP卡                                               1           310.00                0.00
会员卡                                                0           0.00                  200.00
金卡                                                 0           0.00                  506.00
银卡                                                 1           150.00                0.00
合计                                                 2           460.00                706.00

#8


引用 7 楼 KanzakiOrange 的回复:
我自己猜了点数据,你看下是不是这个效果

会员表 客户ID 会员ID 会员类型ID 部门ID 注册日期
CREATE TABLE #Member (ID INT,CusID INT,MemberID INT,DepaID VARCHAR(50),createdate DATETIME)
会员类型表 会员类型ID 会员类型0为充值卡1为次数卡  会员名字
CREATE TABLE #MemberType (MemberID INT,TypeID INT,MemName NVARCHAR(50))
充值记录表 会员ID 金额 充值的部门ID 
CREATE TABLE #Chongzhi (ID INT,MemberID INT,Amount MONEY,CashDepaID VARCHAR(50))

INSERT INTO #Member
        ( ID ,
          CusID ,
          MemberID ,
          DepaID ,
          createdate
        )
VALUES  ( 1 ,1 , 1 , '010101' ,'2016-03-01'),
( 2 ,2 , 2 , '010102' ,'2016-03-02'),
( 3 ,3 , 3 , '010102' ,'2016-02-01'),
( 4 ,4 , 4 , '010101' ,'2016-03-05')

INSERT INTO #MemberType
        ( MemberID, TypeID, MemName )
VALUES  ( 1,  0,  N'VIP卡'),
( 2,  0,  N'会员卡'),
( 3,  0,  N'金卡'),
( 4,  0,  N'银卡')

INSERT INTO #Chongzhi
        ( ID, MemberID ,Amount, CashDepaID )
VALUES  ( 1,1,310,'010101'),
( 2,2,200,'010102'),
( 3,3,506,'010101'),
( 4,4,150,'010102')

DECLARE @DepaID VARCHAR(50) = '010101'
SELECT  CASE WHEN GROUPING(b.MemName) = 1 THEN '合计' ELSE b.MemName END AS [会员卡名称],
COUNT((CASE WHEN a.DepaID = @DepaID THEN a.ID ELSE NULL END)) AS [售卡数],
SUM((CASE WHEN a.DepaID = @DepaID THEN c.Amount ELSE 0 END)) AS [本店销售],
SUM((CASE WHEN a.DepaID <> @DepaID THEN c.Amount ELSE 0 END)) AS [别店在本店销售]
FROM #Member a
INNER JOIN #MemberType b ON a.MemberID = b.MemberID 
LEFT JOIN #Chongzhi c ON a.MemberID = c.MemberID
WHERE a.createdate >= '2016-02-01'
  AND a.createdate < '2016-04-01'
  GROUP BY ROLLUP (b.MemName)

会员卡名称                                              售卡数         本店销售                  别店在本店销售
-------------------------------------------------- ----------- --------------------- ---------------------
VIP卡                                               1           310.00                0.00
会员卡                                                0           0.00                  200.00
金卡                                                 0           0.00                  506.00
银卡                                                 1           150.00                0.00
合计                                                 2           460.00                706.00



恩, 效果是这样的。  能给我一个你的联系方式么。 QQ什么的,  跟你学习下SQL 不会的问你下。

#9


引用 4 楼 KanzakiOrange 的回复:
你能列出一下你想要的效果吗?我也猜不出你到底这个结果集要怎么弄?给点测试数据帮助理解


我现在有个更难的需求。  你能帮我看看么

推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
author-avatar
jianyue1980_852
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有