ALL不和=直接使用的, ANY才和=使用的,表示只要满足集合里面的一个条件就可以了
创新互联公司长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为南开企业提供专业的成都网站设计、做网站,南开网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
ALL 一般是用於 ,=, ,=,常用来表示大于(小于)某个集合的所有元素。
譬如
SELECT sno
FROM tab
WHERE age =(55, 66, 77)是说年龄必须大于集合{55,66,77}的所有元素55 66 77
Clear now?
两个集合比较,可以用IN
SELECT *
FROM student
WHERE sno IN (Select sno from sc where cno = 'c001')
这个就是集合包含关系的一个最经典的例子。
子查询里面是选修了001课程的学生
sno in是凡是包含在 --〉选修了001课程的学生集合里面
没有达不到的,只有你想不到的
学生所选的课程集合要正好等于 课程集合
SELECT *
FROM SC
GROUP BY sno
HAVING COUNT(c_id) = (select count(*) from C)。 这样就达到目标了
SQL很灵活的,实际开发当中很少有人用ALL ANY的
--建立测试表 并插入数据
-- 执行一个查询 ,你可以写在一个存储过程里面,我困了,不过格式按照你说的写好了
CREATE TABLE TB
(说明 NVARCHAR(20)
,
类别 NVARCHAR(20),
金额 INT ,
款项类别 NVARCHAR(20)
)
INSERT INTO dbo.TB
( 说明, 类别, 金额, 款项类别 )
VALUES ( N'项目A', -- 说明 - nvarchar(20)
N'支出', -- 类别 - nvarchar(20)
900, -- 金额 - int
N'费用B' -- 款项类别 - nvarchar(20)
)
INSERT INTO dbo.TB
( 说明, 类别, 金额, 款项类别 )
VALUES ( N'项目A', -- 说明 - nvarchar(20)
N'收入', -- 类别 - nvarchar(20)
2000, -- 金额 - int
N'收入A' -- 款项类别 - nvarchar(20)
)
INSERT INTO dbo.TB
( 说明, 类别, 金额, 款项类别 )
VALUES ( N'项目B', -- 说明 - nvarchar(20)
N'支出', -- 类别 - nvarchar(20)
3500, -- 金额 - int
N'费用C' -- 款项类别 - nvarchar(20)
)
INSERT INTO dbo.TB
( 说明, 类别, 金额, 款项类别 )
VALUES ( N'项目C', -- 说明 - nvarchar(20)
N'支出', -- 类别 - nvarchar(20)
200, -- 金额 - int
N'费用D' -- 款项类别 - nvarchar(20)
)
INSERT INTO dbo.TB
( 说明, 类别, 金额, 款项类别 )
VALUES ( N'项目A', -- 说明 - nvarchar(20)
N'支出', -- 类别 - nvarchar(20)
300, -- 金额 - int
N'费用A' -- 款项类别 - nvarchar(20)
)
CREATE TABLE #temp
(
说明 NVARCHAR(20) ,
类别 NVARCHAR(20) ,
金额 INT ,
款项类别 NVARCHAR(20)
)
INSERT INTO #temp
SELECT *
FROM dbo.TB
UNION ALL
SELECT 说明 ,
CASE WHEN 说明 IS NOT NULL THEN ISNULL(类别, '收支净值')
ELSE 类别
END + '合计' AS 类别 ,
SUM(CASE WHEN 类别 = '收入' THEN 金额
ELSE -金额
END) AS 金额 ,
MAX(款项类别) AS 款项类别
FROM TB
WHERE 说明 IS NOT NULL
GROUP BY ROLLUP(说明, 类别)
ORDER BY 说明
INSERT #temp
SELECT B.*
FROM ( SELECT DISTINCT
说明 ,
'收入合计' AS 类别 ,
0 AS 金额 ,
'' AS 款项类别
FROM #temp
WHERE 说明 IS NOT NULL
) B
WHERE B.说明 + B.类别 NOT IN ( SELECT 说明 + 类别
FROM #temp
WHERE 说明 IS NOT NULL )
INSERT #temp
SELECT B.*
FROM ( SELECT DISTINCT
说明 ,
'支出合计' AS 类别 ,
0 AS 金额 ,
'' AS 款项类别
FROM #temp
WHERE 说明 IS NOT NULL
) B
WHERE B.说明 + B.类别 NOT IN ( SELECT 说明 + 类别
FROM #temp
WHERE 说明 IS NOT NULL );
WITH tt
AS ( SELECT 说明 ,
类别 ,
CASE WHEN 类别 = '支出合计' THEN ABS(金额)
ELSE 金额
END AS 金额 ,
CASE WHEN 类别 = '收入'
OR 类别 = '支出' THEN 款项类别
ELSE ''
END AS 款项类别 ,
CASE WHEN 类别 = '支出' THEN 1
WHEN 类别 = '收入' THEN 2
WHEN 类别 = '收入合计' THEN 3
WHEN 类别 = '支出合计' THEN 4
WHEN 类别 = '收支净值合计' THEN 5
ELSE 6
END AS num
FROM #temp
WHERE 说明 IS NOT NULL
)
SELECT tt.说明 ,
tt.类别 ,
tt.金额 ,
tt.款项类别
FROM tt
ORDER BY 说明 ,
num
DROP TABLE #temp
怎么改题目了?搞的我还把开始的要求给算出来了,如下:
select
a.月份,
a.本月收入总额,
case when b.本月收入总额=0 or b.本月收入总额 IS null then null else
(a.本月收入总额-b.本月收入总额)/b.本月收入总额*100 end 收入增长百分比,
a.本月支出总额,
case when b.本月支出总额=0 or b.本月支出总额 IS null then null else
(a.本月支出总额-b.本月支出总额)/b.本月支出总额*100 end 支出增长百分比,
a.本月余额,
case when b.本月余额=0 or b.本月余额 IS null then null else
(a.本月余额-b.本月余额)/b.本月余额*100 end 余额增长百分比
from
(
select
MONTH(日期) 月份,
isnull(SUM(收入金额),0) 本月收入总额,
isnull(SUM(支出金额),0) 本月支出总额,
isnull(SUM(收入金额),0)-isnull(SUM(支出金额),0) 本月余额
from 收支表
group by MONTH(日期)
) a
left join
(
select
MONTH(日期) 月份,
isnull(SUM(收入金额),0) 本月收入总额,
isnull(SUM(支出金额),0) 本月支出总额,
isnull(SUM(收入金额),0)-isnull(SUM(支出金额),0) 本月余额
from 收支表
group by MONTH(日期)
) b
on a.月份=b.月份+1
order by a.月份 desc
搞到最后才发现你是ACCESS数据库,晕死,那以上SQL Server 代码可能有些地方要修改
比如:case when then else end语句,不知ACCESS是否支持;
left join可能要改成left outer join;
isnull()函数,不知access是否支持;
month()函数,不知access是否支持;
用ACCESS完成这么复杂的运算,的确困难.
补充,用case主要是用来排除0和空值,比如,你6月份的收入为0,7月份的收入3500,那么收入增长百分比就是3500/0,结果是无穷大,你在ACCESS中怎么排除这种情况?