----数据库T-SQL应用----
--字符串函数--
SELECT CHARINDEX('Benet','My  Benet Course',1 )
--用来寻找一个指定的字符串在另一个字符串中的起始位置--
SELECT LEN('SQL Server课程')
--返回传递给它的字符串长度--
SELECT LTRIM ('  周智宇  ')
--清除字符左边的空格--
SELECT RTRIM ('  周智宇  ')
--清除字符右边的空格--
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

SELECT RIGHT('买卖提.吐尔松',3)
--从字符串右边返回指定数目的字符--
SELECT REPLACE('莫乐可切.杨可','','')
--替换一个字符串中的字符--

 

 

--查询用户13701418965在未缴费的市话--
Select '用户'+phonenumber+'市话费用'+cast(charge as varchar(10))+'' AS 市话费用
From accountbill
Where phonenumber='13701418965' AND
IsPaid = 0 AND calltype=0

 

---日期函数---
SELECT GETDATE()
--取得当前的系统日期--
SELECT DATEADD(mm,4,'<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />01/01/1999')
--将指定的数值添加到指定的日期部分后的日期--

 

SELECT  DATEDIFF(mm,'01/01/1999', '05/01/1999')
--两个日期之间的指定日期部分的区别--

 

SELECT DATENAME(dw, '01/01/2000')
--日期中指定日期部分的字符串形式--

 

SELECT DATEPART(day, '01/15/2000')
--日期中指定日期部分的整数形式--

 

 

 

------####################################-------------
--显示用户1370141896520086月份的通话记录的通话时长--
Select '用户'+phonenumber+'通话时长'+cast(datediff(mi,starttime,endtime) as varchar(10))+'分钟' as 通话时长
From "history-call"
Where phonenumber='13701418965'
--------------------------------------------------------

 

 

SELECT ABS(-43)
--取数值表达式的绝对值--

 

SELECT CEILING(43.5)
--取大于或等于指定数值、表达式的最小整数--

 

SELECT FLOOR(43.5)
--取小于或等于指定表达式的最大整数--

 

SELECT POWER(5,2)
--取数值表达式的幂值--

 

SELECT ROUND(43.543,1)
--将数值表达式四舍五入为指定精度--
SELECT SIGN(-43)
--对于正数返回+1,对于负数返回-1,对于0则返回0--

 

SELECT SQRT(9)
--取浮点表达式的平方根--

 

 

-----显示用户1370141896520086月份的通话记录的通话时长(通话时长精确到分钟,不到一分钟的按一分钟计算.--
Select '用户'+phonenumber+'通话时长'+cast(ceiling(datediff(ss,starttime,endtime)/60.0) as varchar(10))+'分钟' as 通话时长  From "history-call"  Where phonenumber='13701418965'

 

 

--*************系统函数*******************----

 

 

SELECT CONVERT (VARCHAR (5),12345)
---数据类型转换----

 

SELECT cast('2009-03-17' as datetime)
---数据类型转换,与convert相比语法较简单,转换功能也少--

 

SELECT CURRENT_USER
---返回当前用户的名字--

 

SELECT DATALENGTH ('中国A联盟')
---返回用于指定表达式的字节数--

 

SELECT HOST_NAME()
---返回当前用户所登录的计算机名字---

 

SELECT SYSTEM_USER
--返回当前所登录的用户名称 --

 

 

SELECT USER_NAME(1)
---从给定的用户ID返回用户名 --

 

--******************************-------
--查询用户的欠费账单记录,要求并显示用户号码和欠费信息
--查询过程是在accountbill表里查询ispaid=0表示未缴费的账单,calltype=0市话,
--calltype=1长话,charge金额,accounttime为账单时间
--显示用户13701418965欠费账单中的市话费用
Select '用户'+phonenumber+''+CAST (DATEPART(YEAR,accounttime) as Varchar(10))+''+ CAST (DATEPART(MONTH,accounttime) as Varchar(10))+'月发生市话费用'+cast(charge as varchar(10))+''
From accountbill
Where phonenumber='13701418965' AND
IsPaid = 0 AND calltype=0 Order By accounttime

 

---显示用户13701418965欠费账单中的长话费用 ---
Select '用户'+phonenumber+''+CAST (DATEPART(YEAR,accounttime) as
Varchar(10))+''+ CAST (DATEPART(MONTH,accounttime) as Varchar(10))+'
月发生长话费用'+CAST(charge as varchar(10))+''
From accountbill Where phonenumber ='13701418965' AND
IsPaid = 0 AND calltype=1 Order By accounttime

 

--滞纳金是超期的天数×欠费金额×1%来计算。用户缴费最后期限
--是用户账单时间所在月份的下个月的26日
--滞纳金是超期的天数×欠费金额×1%来计算。用户缴费最后期限
--是用户账单时间所在月份的下个月的26日。

 

 

--根据账单日期得到账单缴费最后日期

 

--计算缴费日期与账单最后日期的超期天数
--得出欠费天数和欠费的金额
--如果超期天数大于0,则滞纳金=超期天数×欠费金额
Select DateDiff(dd,Cast((cast(year(Dateadd(mm,1,accounttime))
 as varchar(10))+'-'+cast(MONTH(Dateadd(mm,1,accounttime))
as varchar(10))+'-26 00:00:00')
as datetime),Cast('2008-10-31 15:20:00'
as datetime))
as 欠费天数,charge
as 金额,accounttime
as 账单日期
From accountbill
Where phonenumber='13701418965'

 

--***************聚合********************----
--案例需求:查询用户‘13701418965的合计欠费金额--

 

Select Phonenumber,Sum(CHARGE)
From accountbill
Where isPaid=0 AND phoneNumber='13701418965'
--phonenumber' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

 

 

Select Sum(CHARGE)
From accountbill
Where isPaid=0 AND phoneNumber='13701418965'
Go

 

--历史账单中20086月份的用户平均话费--
Select  Avg(CHARGE) as 平均话费
From "history-accountbill"
Where accounttime between '2008-06-01 00:00:00' AND '2008-06-30 23:59:59'

 

---查询20086月电话话费单笔最高费用和单笔最低费用--
Select Max(CHARGE) as 单笔最高话费,Min(CHARGE) as 单笔最低话费
From "history-accountbill"
Where accounttime
 between '2008-06-01 00:00:00' and '2008-06-30 23:59:59'

 

--Tariffsmall数据库中查询欠费账单数,该如何统计账单个数:--
Select Count(*)  as 欠费账单数
From accountbill
Where ispaid=0
--如果查询欠费用户数,该如何统计不同用户号码的数量:
Select Count(Distinct phonenumber)  as 欠费用户数
From accountbill
 Where ispaid=0

 

---****分组汇总****---
--要统计不同课程的平均分数。首先把相同的CourseID都分为一组,
--然后把这些相同组对应的分数值再使用前面的聚合函数取平均值
Select CourseID, Avg(Score)  as 课程平均成绩
From Score
Group By CourseID

 

--***查询082月到7月的客户账单合计费用**--
Select CAST (DATEPART(YEAR,paytime) as varchar(10))+''+ CAST (DATEPART(MONTH,paytime) as varchar(10))+'' AS 日期,Sum(CHARGE) 合计费用
From "history-accountbill" Where isPaid<>0 AND
paytime between '2008-02-01 00:00:00' and '2008-7-31 23:59:59'
Group By CAST (DATEPART(YEAR,paytime) as varchar(10))+''+ CAST (DATEPART(MONTH,paytime) as Varchar(10))+''

 

 

---**内连接**--
USE AdventureWorks ;
GO
SELECT p.Name, sod.SalesOrderID
FROM Production.Product as p
INNER JOIN Sales.SalesOrderDetail as sod
ON (p.ProductID = sod.ProductID)
ORDER BY p.Name ;

 

 

--**左外连接**--
USE AdventureWorks ;
GO
SELECT p.Name, sod.SalesOrderID
FROM Production.Product p
LEFT OUTER JOIN Sales.SalesOrderDetail sod
ON p.ProductID = sod.ProductID
ORDER BY p.Name ;

 

--**右外连接**--
USE AdventureWorks;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesTerritory st
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID ;