Select-sql周周谈-第二周

2001年8月4日 第二周

A. 销售明细

销售明细情况在order Details表中都有反映,只是缺少了ProductName,所以我们连接Procucts与Order Details 表就能得到完整的销售明细情况。这其实在上周的最后一个查询已经完全做到了,这里就重复一次。还有提请大家注意的是,关于销售实际金额的计算公式为:数量*单价*(1-折扣)。

在SQL Server中,这句语句如下:

SELECT [ORDER DETAILS].ORDERID,[ORDER DETAILS].PRODUCTID,PRODUCTS.PRODUCTNAME,
[ORDER DETAILS].UNITPRICE,[ORDER DETAILS].QUANTITY,[ORDER DETAILS].DISCOUNT,
[ORDER DETAILS].UNITPRICE*[ORDER DETAILS].QUANTITY*(1-[ORDER DETAILS].DISCOUNT) AS EXTENDEDPRICE
FROM [ORDER DETAILS] INNER JOIN PRODUCTS ON [ORDER DETAILS].PRODUCTID=PRODUCTS.PRODUCTID

在VFP中也没有什么变化(上周笔者已经在Visual FoxPro中把Order Details 表更名为Order_Details),语句如下:

SELECT ORDER_DETAILS.ORDERID,ORDER_DETAILS.PRODUCTID,PRODUCTS.PRODUCTNAME,;
ORDER_DETAILS.UNITPRICE,ORDER_DETAILS.QUANTITY,ORDER_DETAILS.DISCOUNT,;
ORDER_DETAILS.UNITPRICE*ORDER_DETAILS.QUANTITY*(1-ORDER_DETAILS.DISCOUNT) AS EXTENDEDPRICE;
FROM ORDER_DETAILS INNER JOIN PRODUCTS ON ORDER_DETAILS.PRODUCTID=PRODUCTS.PRODUCTID

B. 销售合计

每一张销售单据中对应着数条明细产品销售,那么销售单据的金额合计怎么计算呢?很简单只要在Order Details中把同一张单据的销售金额累计在一起,在SQL Server实现如下:

SELECT [ORDER DETAILS].ORDERID,SUM([ORDER DETAILS].UNITPRICE*[ORDER DETAILS].QUANTITY*(1-[ORDER DETAILS].DISCOUNT)) AS SUBTOTALFROM [ORDER DETAILS]

在Visual FoxPro中实现起来也是一样的:

SELECT ORDER_DETAILS.ORDERID,;
SUM(ORDER_DETAILS.UNITPRICE*ORDER_DETAILS.QUANTITY*(1-ORDER_DETAILS.DISCOUNT)) AS SUBTOTAL;
FROM ORDER_DETAILS GROUP BY ORDER_DETAILS.ORDERID

C.只想知道销售单号为:10248的销售合计怎么办?

上例中我们得到的结果集是所有销售单的销售合计情况,现在我们要在此基础上过滤掉其他所有的单据合计,只要销售单号为:10248的销售情况。在SQL Server中有两种做法:其一,先分别合计所有单据(上例中已完成),在过滤不合条件的合计信息;其二,先过滤所有不合条件的销售明细,在合计剩下的销售明细。

做法一:(用Having关键字)

SELECT [ORDER DETAILS].ORDERID,SUM([ORDER DETAILS].UNITPRICE*[ORDER DETAILS].QUANTITY*(1-[ORDER DETAILS].DISCOUNT)) AS SUBTOTAL
FROM [ORDER DETAILS] GROUP BY [ORDER DETAILS].ORDERID HAVING [ORDER DETAILS].ORDERID=10248

做法二:(用Where关键字)

SELECT [ORDER DETAILS].ORDERID,SUM([ORDER DETAILS].UNITPRICE*[ORDER DETAILS].QUANTITY*(1-[ORDER DETAILS].DISCOUNT)) AS SUBTOTAL
FROM [ORDER DETAILS] WHERE [ORDER DETAILS].ORDERID=10248 GROUP BY [ORDER DETAILS].ORDERID

在Visual FoxPro中同样可以以这两种方法实现:

做法一:(用Having关键字)

SELECT ORDER_DETAILS.ORDERID,;
SUM(ORDER_DETAILS.UNITPRICE*ORDER_DETAILS.QUANTITY*(1-ORDER_DETAILS.DISCOUNT)) AS SUBTOTAL;
FROM ORDER_DETAILS GROUP BY ORDER_DETAILS.ORDERID HAVING ORDER_DETAILS.ORDERID=10248

做法二:(用Where关键字)

SELECT ORDER_DETAILS.ORDERID,;
SUM(ORDER_DETAILS.UNITPRICE*ORDER_DETAILS.QUANTITY*(1-ORDER_DETAILS.DISCOUNT)) AS SUBTOTAL;
FROM ORDER_DETAILS WHERE ORDER_DETAILS.ORDERID=10248 GROUP BY ORDER_DETAILS.ORDERID

D.1997的产品销售情况

先来看看SQL Server中的实现吧:

SELECT CATEGORIES.CATEGORYNAME,PRODUCTS.PRODUCTNAME,
SUM([ORDER DETAILS].UNITPRICE*[ORDER DETAILS].QUANTITY*(1-[ORDER DETAILS].DISCOUNT)) AS PRODUCTSALES
FROM (CATEGORIES INNER JOIN PRODUCTS ON CATEGORIES.CATEGORYID=PRODUCTS.CATEGORYID)
INNER JOIN
(ORDERS INNER JOIN [ORDER DETAILS] ON ORDERS.ORDERID=[ORDER DETAILS].ORDERID)
ON PRODUCTS.PRODUCTID=[ORDER DETAILS].PRODUCTID
WHERE ORDERS.SHIPPEDDATE>='19970101' AND ORDERS.SHIPPEDDATE<='19971231'
GROUP BY CATEGORIES.CATEGORYNAME,PRODUCTS.PRODUCTNAME

你也许会问,这里的Where字句能不能用Having字句替换,就像上例中那样?不行,因为数据集合经过分组合并以后,ShippedDate字段已经不存在(也可以理解为不具备任何意义)了,这是用它作为Having字句的过滤分组结果的依据就不可能了。所以本例中我们的做法是:连接所有的表,过滤掉ShippedDate不合要求的数据,然后按产品类别分组,如果类别相同就按产品名称分组,最终得到1997年的产品销售合计信息。

在Visual FoxPro中也是一样的实现:

SELECT CATEGORIES.CATEGORYNAME,PRODUCTS.PRODUCTNAME,;
SUM(ORDER_DETAILS.UNITPRICE*ORDER_DETAILS.QUANTITY*(1-ORDER_DETAILS.DISCOUNT)) AS PRODUCTSALES;
FROM (CATEGORIES INNER JOIN PRODUCTS ON CATEGORIES.CATEGORYID=PRODUCTS.CATEGORYID);
INNER JOIN;
(ORDERS INNER JOIN ORDER_DETAILS ON ORDERS.ORDERID=ORDER_DETAILS.ORDERID);
ON PRODUCTS.PRODUCTID=ORDER_DETAILS.PRODUCTID ;
WHERE ORDERS.SHIPPEDDATE>={^1997-01-01} AND ORDERS.SHIPPEDDATE<={^1997-12-31} ;
GROUP BY CATEGORIES.CATEGORYNAME,PRODUCTS.PRODUCTNAME

大家也许已经注意到了SQL Server中的日期表示与Visual FoxPro中很不一样。在SQL Server中以单引号为分隔符表示日期(可以认为是一个字符串),以下的写法都是合法的:'1997-12-31';'19971231'。

在SQL Server比较日期的大小,除了可以用">、=、<"号之外,也可以用Between关键字与DateDiff()函数实现,分别如下:

用Between关键字:

SELECT CATEGORIES.CATEGORYNAME,PRODUCTS.PRODUCTNAME,
SUM([ORDER DETAILS].UNITPRICE*[ORDER DETAILS].QUANTITY*(1-[ORDER DETAILS].DISCOUNT)) AS PRODUCTSALES
FROM (CATEGORIES INNER JOIN PRODUCTS ON CATEGORIES.CATEGORYID=PRODUCTS.CATEGORYID)
INNER JOIN
(ORDERS INNER JOIN [ORDER DETAILS] ON ORDERS.ORDERID=[ORDER DETAILS].ORDERID)
ON PRODUCTS.PRODUCTID=[ORDER DETAILS].PRODUCTID
WHERE ORDERS.SHIPPEDDATE BETWEEN '1997-01-01' AND '1997-12-31'
GROUP BY CATEGORIES.CATEGORYNAME,PRODUCTS.PRODUCTNAME

用DateDiff()函数

SELECT CATEGORIES.CATEGORYNAME,PRODUCTS.PRODUCTNAME,
SUM([ORDER DETAILS].UNITPRICE*[ORDER DETAILS].QUANTITY*(1-[ORDER DETAILS].DISCOUNT)) AS PRODUCTSALES
FROM (CATEGORIES INNER JOIN PRODUCTS ON CATEGORIES.CATEGORYID=PRODUCTS.CATEGORYID)
INNER JOIN
(ORDERS INNER JOIN [ORDER DETAILS] ON ORDERS.ORDERID=[ORDER DETAILS].ORDERID)
ON PRODUCTS.PRODUCTID=[ORDER DETAILS].PRODUCTID
WHERE DATEDIFF(DD,ORDERS.SHIPPEDDATE,'1997-01-01')<=0 AND DATEDIFF(DD,ORDERS.SHIPPEDDATE,'1997-12-31')>=0
GROUP BY CATEGORIES.CATEGORYNAME,PRODUCTS.PRODUCTNAME

在Visual FoxPro中还其他的日期比较方式呢?用Between关键字是可以的,如下:

SELECT CATEGORIES.CATEGORYNAME,PRODUCTS.PRODUCTNAME,;
SUM(ORDER_DETAILS.UNITPRICE*ORDER_DETAILS.QUANTITY*(1-ORDER_DETAILS.DISCOUNT)) AS PRODUCTSALES;
FROM (CATEGORIES INNER JOIN PRODUCTS ON CATEGORIES.CATEGORYID=PRODUCTS.CATEGORYID);
INNER JOIN;
(ORDERS INNER JOIN ORDER_DETAILS ON ORDERS.ORDERID=ORDER_DETAILS.ORDERID);
ON PRODUCTS.PRODUCTID=ORDER_DETAILS.PRODUCTID ;
WHERE ORDERS.SHIPPEDDATE BETWEEN {^1997-01-01} AND {^1997-12-31} ;
GROUP BY CATEGORIES.CATEGORYNAME,PRODUCTS.PRODUCTNAME

本周的内容就到这里了,这次我们讲解了分组的问题,并讨论了分组过滤的两种思路,这是值得关注的问题;还有就是在SQL Server中的日期表示方式以及日期值的比较方法。

时间: 2024-10-31 02:54:24

Select-sql周周谈-第二周的相关文章

4月第二周中国域名增5.7万再居第二 香港减461个

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 IDC评述网(idcps.com)04月21日报道:根据WebHosting.info最新数据显示,截至3721.html">2014年4月14日,我国域名注册总量近800万,达7,907,696个,仅次美国,位居全球第二名.在4月第二周期间,新增5.7万个域名,在20家上榜国家中增量排名第二.而美国,再次成为双冠王.中国香港

全球.BIZ域名一周统计:8月第二周新增3,111个

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 中国IDC评述网08月21日报道:近日,据WebHosting.info公布的数据显示,截至2012年8月13日,全球.BIZ域名注册总量为2,191,462个,8月第二周持续增长,新增3,111个.下面,IDC评述网与大家一起关注.BIZ域名注册总量情况(如图一图二). 图一:.BIZ域名注册总量分布情况(2012-7-9至2012-8-1

2010春季日剧第二周榜评等待木村拓哉的月9

2010年4月19日到2010年4月25日这一周,10年春季档日剧收视率从电视台方面格局发生了很大改变,一直处于民办电视台老大的富士电视台本季收视率不尽理想,木村拓哉领衔的月9没有放送,但是从剧本到演员都曾出现混乱情况的月9能否在开播后一挽狂澜还是未知数,但富士台已播放的热门剧集<白色荣光>的第二部和人气偶像担当的<无法坦诚相对>都没有取得预期收视率.开播两周朝日电视台以17%平均收视率处于领先,紧随其后的是日本电视台的14.23%,富士电视台以14.17%的平均收视率暂居第三位,

5月第二周全球域名解析商Top15:万网第7 DNSPod第9

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断淘宝客 站长团购 云主机 技术大厅 IDC评述网05月20日报道:根据WebHosting.info最新数据,5月第二周(5月6日-5月12日),全球域名市场基本保持稳定.在全球前十五强域名解析服务商榜单中,与上周相比,美国表现依旧强劲,再次包揽前6名.其中,WILDWESTDOMAINS.COM一家独大之势尽显.而在中国方面,仍仅两家上榜.其中,中国万网排名第7,DN

4月第二周全球五大顶级域名现负增长 痛失近6.3万个

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 据域名统计机构WebHosting.Info公布的最新数据显示,截至2012年4月9日,全球五大顶级域名 (.COM..NET..ORG..INFO和BIZ)的总量达130,520,507个,环比上周损失62,672个,域名呈现负增长.下面IDC评述 网与大家一起关注这五大顶级域名的最新动态. (图1)全球五大顶级域名注册总量分布图(截至20

8月第二周IT类网站/频道排名:天极网上升至第二

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 中国IDC评述网08月17日报道:近日,根据国际统计机构Alexa公布的最新数据显示,8月第二周(2012-8-6到2012-8-12),我国IT类网站/频道排名中,太平洋电脑网以5740的周均用户覆盖数稳居榜首,天极网则以3860的周均用户覆盖数上升至第二名,中关村在线退居第三,周均用户覆盖数为3490. 图一:国内IT类网站/频道周均用户

7月第二周国内在线新闻网站访问量排名 QQ居首

中介交易 SEO诊断 淘宝客 云主机 技术大厅 随着互联网技术的日趋成熟,人们对新闻媒介的选择也随之改变.而网络新闻服务技术的高低是检验每个网络新闻媒体好坏的标尺.据国外媒体最新报道,美国两大科技巨头谷歌与雅虎眼下都在加大研发力度以向互联网使用者提供更好的在线新闻服务体验众所周知,雅虎如今已经成为最受欢迎的新闻网站,根据尼尔森(Nielsen)调查公司的统计,雅虎2009年拥有约4100万独立访客.而谷歌目前在在线新闻媒体排行榜中排名第六. 如此,我们便来看看国内在线新闻媒体在37216.htm

金九第二周楼市交易微妙七大城市房价下跌

地产中国网监测数据显示,全国10个重点城市(北京.上海.广州.深圳.南京.杭州.厦门.天津.重庆及成都)的楼市在"金九"第二周(9.6-9.12) 成交量继续上扬,七大城市交易面积环比上涨,而上海成交面积尽管小幅下滑,但成交套数却上涨.其中成交面积涨幅最大为广州,上涨36.5%.在成交价格方面上涨趋势并未得到延续. "金九"销售旺季得到延续.在地产中国网监测的全国10个重点城市中,上周(9.6-9.12)成交面积环比下滑仅有上海.重庆及天津三城市,而上海成交套数却环

5月第二周域名主机网站排名:万网西部数码居前二

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 据国际统计机构Alexa公布的最新数据显示,5月第二周(5月7日-5月13日),国内域名主机网站覆盖率位居前三的是中国万网.西部数码和易名中国.其中,万网周均用户覆盖数达1500,西部数码为600,易名中国570. (图1)域名主机网站周均用户覆盖数统计排名 如图1所示,5月第二周,用户覆盖数排名Top15的域名主机网站是:中国万网.西部数码