项目中遇到的难题:一个疑难SQL语句
需要查询的数据来源于两张数据表:OrderList(订单表)、ShopInfo(门店表)
订单表涉及到的查询字段如下:
order_id(订单号,主关键字)、order_status(订单状态)、order_date(下单时间)、shop_id(门店号)、money(订单金额)。
门店表涉及到的查询字段如下:
shop_id(主关键字,订单表的外键)、shop_sheng(门店所在省)、shop_shi(门店所在市)、shop_xian(门店所在县)、shop_address(门店详细地址)、shop_boss(门店负责人)、shop_phone(门店收货手机号码)
每个门店每天会有若干个订单,总公司每天通过快递或邮政的方式发货到门店。当天订单总金额高于指定金额(假如是100)的门店,走快递发货,低于指定金额的门店,走邮政发货,对于偏远地区(新疆、西藏、内蒙、青海),一律走邮政发货。
发快递的SQL很快写好了:
SELECT a.shop_id, a.shop_boss, a.shop_phone, a.shop_sheng, shop_shi, shop_xian, a.shop_address, SUM(b.money) as sum_money,COUNT(b.order_id) as order_cnt FROM shopInfo a inner join OrderList b on a.shop_id = b.shop_id
WHERE b.order_status = 5 AND NOT a.shop_sheng IN ('新疆','西藏','内蒙','青海') AND order_date BETWEEN @date1 AND @date2
GROUP BY a.shop_id, a.shop_boss, a.shop_phone, a.shop_sheng, a.shop_shi, a.shop_xian, a.shop_address
HAVING SUM(b.money)>=100
能正确查询到数据
但是,发邮政的SQL按下面写出来后,查询到的数据不对:
SELECT a.shop_id, a.shop_boss, a.shop_phone, a.shop_sheng, shop_shi, shop_xian, a.shop_address, SUM(b.money) as sum_money,COUNT(b.order_id) as order_cnt FROM shopInfo a inner join OrderList b on a.shop_id = b.shop_id
WHERE b.order_status = 5 AND order_date BETWEEN @date1 AND @date2 OR a.shop_sheng IN ('新疆','西藏','内蒙','青海')
GROUP BY a.shop_id, a.shop_boss, a.shop_phone, a.shop_sheng, a.shop_shi, a.shop_xian, a.shop_address
HAVING SUM(b.money)<100
分析发现,是WHERE条件里面的 OR 部分对收货地区的限定不对,但这个条件该怎么写呢?卡了好久,写不出来,只好求助大神了。
订单表涉及到的查询字段如下:
order_id(订单号,主关键字)、order_status(订单状态)、order_date(下单时间)、shop_id(门店号)、money(订单金额)。
门店表涉及到的查询字段如下:
shop_id(主关键字,订单表的外键)、shop_sheng(门店所在省)、shop_shi(门店所在市)、shop_xian(门店所在县)、shop_address(门店详细地址)、shop_boss(门店负责人)、shop_phone(门店收货手机号码)
每个门店每天会有若干个订单,总公司每天通过快递或邮政的方式发货到门店。当天订单总金额高于指定金额(假如是100)的门店,走快递发货,低于指定金额的门店,走邮政发货,对于偏远地区(新疆、西藏、内蒙、青海),一律走邮政发货。
发快递的SQL很快写好了:
SELECT a.shop_id, a.shop_boss, a.shop_phone, a.shop_sheng, shop_shi, shop_xian, a.shop_address, SUM(b.money) as sum_money,COUNT(b.order_id) as order_cnt FROM shopInfo a inner join OrderList b on a.shop_id = b.shop_id
WHERE b.order_status = 5 AND NOT a.shop_sheng IN ('新疆','西藏','内蒙','青海') AND order_date BETWEEN @date1 AND @date2
GROUP BY a.shop_id, a.shop_boss, a.shop_phone, a.shop_sheng, a.shop_shi, a.shop_xian, a.shop_address
HAVING SUM(b.money)>=100
能正确查询到数据
但是,发邮政的SQL按下面写出来后,查询到的数据不对:
SELECT a.shop_id, a.shop_boss, a.shop_phone, a.shop_sheng, shop_shi, shop_xian, a.shop_address, SUM(b.money) as sum_money,COUNT(b.order_id) as order_cnt FROM shopInfo a inner join OrderList b on a.shop_id = b.shop_id
WHERE b.order_status = 5 AND order_date BETWEEN @date1 AND @date2 OR a.shop_sheng IN ('新疆','西藏','内蒙','青海')
GROUP BY a.shop_id, a.shop_boss, a.shop_phone, a.shop_sheng, a.shop_shi, a.shop_xian, a.shop_address
HAVING SUM(b.money)<100
分析发现,是WHERE条件里面的 OR 部分对收货地区的限定不对,但这个条件该怎么写呢?卡了好久,写不出来,只好求助大神了。
...全文
相关推荐
VS2005(c#)项目调试疑难问题解决方法锦集
### VS2005(c#)项目调试疑难问题解决方法锦集在使用Visual Studio 2005进行C#项目开发时,开发者经常会遇到各种各样的问题,尤其是在调试阶段。
sql语句妙用,各种sql语句的详细用法与讲解
注意,当字符串包含在SQL语句中时,需要确保单引号的正确处理。例如,如果一个字符串中包含单引号,可以使用两个单引号('')来表示一个实际的单引号。
Oracle Sql语句转换成Mysql Sql语句
本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。Oracle SQL与MySQL SQL的主要差异在于以下几个方面:1.
Java打印漂亮的SQL语句(被格式化的SQL语句)
标签"进一步强调了这个工具的关键特性,包括"Java输出漂亮的SQL语句",这意味着它是一个Java环境下的解决方案,能够集成到Java项目中,通过Java代码来调用和实现SQL语句的格式化。
一个简单的sql循环语句脚本
本话题将详细讲解一个简单的SQL循环语句脚本及其相关知识。一、SQL循环语句概述SQL循环语句主要包括WHILE循环和FOR循环,它们允许我们在满足特定条件时重复执行一段代码块。


应用实例
