復雜sql語句
語句(假設你的系統取日期月份的函數MONTH):
SELECT MONTH(注冊日期),COUNT(*) FROM 表 GROUP BY 1
產生的結果是:
1 23
2 10
3 45
如果你計算每個月度(200801、200802、……)的注冊人數,應該使用下面的語句(假設你的系統取日期年度的函數是YEAR):
SELECT YEAR(注冊日期)+" "+MONTH(注冊日期),COUNT(*) FROM 表 GROUP BY 1
假如你的系統連接字符串不是使用+,那換為相應的字符或者函數,比如INFORMIX是使用YEAR(注冊日期)||MONTH(注冊日期),比如MYSQL是使用CONCATE函數
補充:
SELECT語句的教材專門有聚合函數那一章,你仔細看看吧。
在SELECT語句里面,GROUP子句配合SUM,AVG,MAX,MIN等函數完成分類統計功能,執行我的兩個語句,查看輸出的結果,你就知道GROUP的含義,下面取一個最簡單的例子:
“SELECT COUNT(*) FROM 表”這個SQL語句返回的結果只有一個,就是數據庫中的總記錄條數,如果我們想統計不同用戶名的分組進行匯總的記錄條數,就應該在SELECT后增加一個字段,同事GROUP BY這個字段,完整的語句是:
SELECT 用戶名,COUNT(*) FROM 表 GROUP BY 用戶名
這個語句也可以這樣寫:
SELECT 用戶名,COUNT(*) FROM 表 GROUP BY 1
這時候GROUP BY后面的整數表示按照相應序號的SELECT列分組,這里的1表示第一個的選擇結果“用戶名”。如果我們想按用戶分組查記錄數,但是只現實有重復的記錄,那么用GROUP BY的一個HAVING修飾,完整語句如下:
SELECT 用戶名,COUNT(*) FROM 表 GROUP BY 用戶名 HAVING COUNT(*)>1
復雜的sql語句
描述有點不具體,這個是把結果以列的形式展示:
select id,name,case when time1>time2 then '錯誤一' end as type1,
case when time1>time3 then '錯誤二' end as type2,
case when time4>time5 then '錯誤三' end as type3
from test
where name = '小明'
---結果集放在一起
select id,name,case when time1>time2 then '錯誤一' end +
case when time1>time3 then '錯誤二' end +
case when time4>time5 then '錯誤三' end as Result
from test
where name = '小明'
一個復雜的sql 語句
汗一個,我用一個sql實現了,在Sql2005下測試通過:
DECLARE @key NVARCHAR(MAX);
SET @key = '中';--要搜索的關鍵詞
SELECT CASE
WHEN t IS NULL THEN N'(' + @key + N')' + SUBSTRING(k, LEN(@key) + 1, LEN(k))
ELSE N'(' + t + N')' + SUBSTRING(k, LEN(t) + 1, LEN(k))
END
FROM (
SELECT k,
(
SELECT TOP 1 k
FROM 關鍵詞表 a1
WHERE a2.k LIKE a1.k + '%'
) t
FROM 內容表 a2
WHERE k LIKE @key + '%'
) a
如果用一條sql實現,很困難,建議用存儲過程實現
或用程序去實現
復雜的sql語句
不是很復雜,只有一個子查詢,最后那個from里邊有很多內連接和外連接,主要是跟業務相關的,表多點不復雜,不知道你的業務邏輯,說不清楚主要函數,case when,就是根據不同的case選擇一個結果decode,跟case when差不多,DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )nvl,判斷是否為空的,NVL( string1, replace_with) ,如果為空就用replace_with代替group by rollup,不太容易說清楚,給你個連接自己看吧做個小例子也容易理解http://**ghostgant/article/details/5699731。
一段很復雜很復雜的SQL語句
Select * From ( Select * From ( Select Number ,ChineseName ,*mentCode ,DepartmentName ,ShiftId ,ShiftName ,Degree ,AskForLeaveType ,WorkOnDate ,OnDutyType ,StartTime ,EndTime ,AOnDuty ,AOffDuty ,Allday ,*al ,'Error'= Case When Degree=1 AND StartTime0 AND Left(AskForLeaveType,1)='0' Then 0 When Degree=1 AND StartTime>=AOffDuty AND ShiftId>0 AND Left(AskForLeaveType,1)='0' Then 0 When Degree=1 AND StartTime>=WorkOnDate+' '+'12:30' AND EndTime 0 AND ShiftId>0 AND Left(AskForLeaveType,1)='0' Then 0 When Degree=2 AND StartTime0 AND Left(AskForLeaveType,1)='0' Then 0 When Degree=2 AND StartTime>=AOffDuty AND EndTime0 AND Left(AskForLeaveType,1)='0' Then 0 When Degree=2 AND StartTime>=BOffDuty AND ShiftId>0 AND Left(AskForLeaveType,1)='0' Then 0 When Degree=3 AND StartTime0 AND Left(AskForLeaveType,1)='0' Then 0 When Degree=3 AND StartTime>=AOffDuty AND EndTime0 AND Left(AskForLeaveType,1)='0' Then 0 When Degree=3 AND StartTime>=BOffDuty AND EndTime0 AND Left(AskForLeaveType,1)='0' Then 0 When Degree=3 AND StartTime>=COffDuty AND ShiftId>0 AND Left(AskForLeaveType,1)='0' Then 0 When ShiftId=0 AND Left(AskForLeaveType,1)='0' Then 0 When ShiftId>0 AND Left(AskForLeaveType,1)'0' AND Left(OnDutyType,1)=0 Then 0 When ShiftId>0 AND Left(AskForLeaveType,1)'0' AND Left(OnDutyType,1)=2 AND AskForLeaveType='出差假' Then 0 When ShiftId>0 AND Left(AskForLeaveType,1)'0' AND Left(OnDutyType,1)=2 AND AskForLeaveType='產假' Then 0 When ShiftId=0 AND Left(AskForLeaveType,1)'0' AND Convert(varchar(10),StartTime,108)='00:00:00' AND Convert(varchar(10),EndTime,108)='00:30:00' Then 0 Else 1 End From ( Select Number ,ChineseName ,DepartmentName ,*mentCode ,*d ,*ame ,Degree ,AskForLeaveType ,Convert(varchar(10),WorkOnDate,120) as 'WorkOnDate' ,StartTime ,EndTime ,AllDay ,SumTotal ,Case When Right(Convert(Varchar(10),WorkOnDate,120),5) IN (select Right(Convert(Varchar(10),HolidayDate,120),5) From AttendanceHoliday) THEN '2 - 公眾假上班' ELSE '0 - 平時上班' END AS 'OnDutyType' ,Case When Left(FristBrushDate,1)='1' AND Convert(varchar(10),AOffDuty,120)>Convert(varchar(10),AOnDuty,120) Then CAST(Convert(Varchar(11),Dateadd(dd,-1,OnDutyDate),120)+Convert(Varchar(5),AOnDuty,108) AS DateTime) ELSE CAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),AOnDuty,108) AS DateTime) End AS 'AOnDuty' ,Case When Left(FristBrushDate,1)='0' AND Convert(varchar(10),AOnDuty,120)1 Group by Number,ChineseName,*mentCode,DepartmentName,*d,*ame,Degree,AskForLeaveType,AllDay,WorkOnDate,StartTime,EndTime,Sumtotal having Count(1)>1 ) tb3 ) tb4對你的代碼格式化后發現,還缺少一些語句,你是否粘貼完整了?讀完SQL語句后發現,其實是一個考勤核算的查詢語句,是兩個大的SQL查詢Union ALL的結果。
一個極其復雜的sql語句
我沒有你的表結構,我只給你說一下思想.首先你有五個表,get(order_id,id),account(type_id,money),travel(order_id,money),finance(ord_id,money),tourise(id)有一個問題你沒有說清楚,你要的是兩者比較大于的記錄還是小于的記錄.下面是你要的SQL語句,你寫的和什么以及什么都搞亂了!一定要把你的話寫清楚我才能幫你解決:select *_id,sum(*),sum(*) from get inner join account on *=*_idinner join travel on *_id=*_id inner join finance on *_id=*_idinner join tourist on *_id=*e sum(*)>sum(*)group by *_id 因為我沒有你的表結構,你只要看著我的捎改一下就行了!其實并不難,并且你敘述的內容也不是很清楚。
.。
復雜sql語句查詢
select id,name,isnull((select SUM(金額) from B表 where id=A表.id and bno=20),0) 正常消費,isnull((select SUM(金額) from B表 where id=A表.id and bno=30),0) 充值,(select top 1 余額 from B表 where id=A表.id order by 時間 desc) 余額,(select MAX(時間) from B表 where id=A表.id) 時間
from A表
這樣看一下行不行