ALL不和=直接使用的, ANY才和=使用的,表示只要滿足集合里面的一個(gè)條件就可以了
創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為南開企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,南開網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
ALL 一般是用於 ,=, ,=,常用來表示大于(小于)某個(gè)集合的所有元素。
譬如
SELECT sno
FROM tab
WHERE age =(55, 66, 77)是說年齡必須大于集合{55,66,77}的所有元素55 66 77
Clear now?
兩個(gè)集合比較,可以用IN
SELECT *
FROM student
WHERE sno IN (Select sno from sc where cno = 'c001')
這個(gè)就是集合包含關(guān)系的一個(gè)最經(jīng)典的例子。
子查詢里面是選修了001課程的學(xué)生
sno in是凡是包含在 --〉選修了001課程的學(xué)生集合里面
沒有達(dá)不到的,只有你想不到的
學(xué)生所選的課程集合要正好等于 課程集合
SELECT *
FROM SC
GROUP BY sno
HAVING COUNT(c_id) = (select count(*) from C)。 這樣就達(dá)到目標(biāo)了
SQL很靈活的,實(shí)際開發(fā)當(dāng)中很少有人用ALL ANY的
--建立測(cè)試表 并插入數(shù)據(jù)
-- 執(zhí)行一個(gè)查詢 ,你可以寫在一個(gè)存儲(chǔ)過程里面,我困了,不過格式按照你說的寫好了
CREATE?TABLE?TB?
(說明?NVARCHAR(20)
,
類別?NVARCHAR(20),
金額?INT?,
款項(xiàng)類別?NVARCHAR(20)
)
INSERT?INTO?dbo.TB
(?說明,?類別,?金額,?款項(xiàng)類別?)
VALUES??(?N'項(xiàng)目A',?--?說明?-?nvarchar(20)
N'支出',?--?類別?-?nvarchar(20)
900,?--?金額?-?int
N'費(fèi)用B'??--?款項(xiàng)類別?-?nvarchar(20)
)
INSERT?INTO?dbo.TB
(?說明,?類別,?金額,?款項(xiàng)類別?)
VALUES??(?N'項(xiàng)目A',?--?說明?-?nvarchar(20)
N'收入',?--?類別?-?nvarchar(20)
2000,?--?金額?-?int
N'收入A'??--?款項(xiàng)類別?-?nvarchar(20)
)
INSERT?INTO?dbo.TB
(?說明,?類別,?金額,?款項(xiàng)類別?)
VALUES??(?N'項(xiàng)目B',?--?說明?-?nvarchar(20)
N'支出',?--?類別?-?nvarchar(20)
3500,?--?金額?-?int
N'費(fèi)用C'??--?款項(xiàng)類別?-?nvarchar(20)
)
INSERT?INTO?dbo.TB
(?說明,?類別,?金額,?款項(xiàng)類別?)
VALUES??(?N'項(xiàng)目C',?--?說明?-?nvarchar(20)
N'支出',?--?類別?-?nvarchar(20)
200,?--?金額?-?int
N'費(fèi)用D'??--?款項(xiàng)類別?-?nvarchar(20)
)
INSERT?INTO?dbo.TB
(?說明,?類別,?金額,?款項(xiàng)類別?)
VALUES??(?N'項(xiàng)目A',?--?說明?-?nvarchar(20)
N'支出',?--?類別?-?nvarchar(20)
300,?--?金額?-?int
N'費(fèi)用A'??--?款項(xiàng)類別?-?nvarchar(20)
)
CREATE?TABLE?#temp
(
說明?NVARCHAR(20)?,
類別?NVARCHAR(20)?,
金額?INT?,
款項(xiàng)類別?NVARCHAR(20)
)
INSERT??INTO?#temp
SELECT??*
FROM????dbo.TB
UNION?ALL
SELECT??說明?,
CASE?WHEN?說明?IS?NOT??NULL?THEN?ISNULL(類別,?'收支凈值')
ELSE?類別
END?+?'合計(jì)'?AS?類別?,
SUM(CASE?WHEN?類別?=?'收入'?THEN?金額
ELSE?-金額
END)?AS?金額?,
MAX(款項(xiàng)類別)?AS?款項(xiàng)類別
FROM????TB
WHERE???說明?IS?NOT?NULL
GROUP?BY?ROLLUP(說明,?類別)
ORDER?BY?說明?
INSERT??#temp
SELECT??B.*
FROM????(?SELECT?DISTINCT
說明?,
'收入合計(jì)'?AS?類別?,
0?AS?金額?,
''?AS?款項(xiàng)類別
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
說明?,
'支出合計(jì)'?AS?類別?,
0?AS?金額?,
''?AS?款項(xiàng)類別
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?類別?=?'支出合計(jì)'?THEN?ABS(金額)
ELSE?金額
END?AS?金額?,
CASE?WHEN?類別?=?'收入'
OR?類別?=?'支出'?THEN?款項(xiàng)類別
ELSE?''
END?AS?款項(xiàng)類別?,
CASE?WHEN?類別?=?'支出'?THEN?1
WHEN?類別?=?'收入'?THEN?2
WHEN?類別?=?'收入合計(jì)'?THEN?3
WHEN?類別?=?'支出合計(jì)'?THEN?4
WHEN?類別?=?'收支凈值合計(jì)'?THEN?5
ELSE?6
END?AS?num
FROM?????#temp
WHERE????說明?IS?NOT?NULL
)
SELECT??tt.說明?,
tt.類別?,
tt.金額?,
tt.款項(xiàng)類別
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
搞到最后才發(fā)現(xiàn)你是ACCESS數(shù)據(jù)庫,暈死,那以上SQL Server 代碼可能有些地方要修改
比如:case when then else end語句,不知ACCESS是否支持;
left join可能要改成left outer join;
isnull()函數(shù),不知access是否支持;
month()函數(shù),不知access是否支持;
用ACCESS完成這么復(fù)雜的運(yùn)算,的確困難.
補(bǔ)充,用case主要是用來排除0和空值,比如,你6月份的收入為0,7月份的收入3500,那么收入增長百分比就是3500/0,結(jié)果是無窮大,你在ACCESS中怎么排除這種情況?