淘宝/天猫获得淘宝商品快递费用 API接口item_fee商品采集

文章介绍了如何使用TaobaoAPI来获取商品(num_iid:572050066584)在指定区域(area_id:152501)的运费信息,包括快递费、EMS费用和普通邮寄费用。

taobao.item_fee

公共参数

请求URL:o0b.cn/imike 获取API测试账号。
名称类型必须描述
keyString调用key(必须以GET方式拼接在URL中)
secretString调用密钥
api_nameStringAPI接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]
cacheString[yes,no]默认yes,将调用缓存的数据,速度比较快
result_typeString[json,jsonu,xml,serialize,var_export]返回数据格式,默认为json,jsonu输出的内容中文可以直接阅读
langString[cn,en,ru]翻译语言,默认cn简体中文
versionStringAPI版本

请求参数

请求参数:num_iid=572050066584&area_id=152501&sku=0

参数说明:num_iid:淘宝商品ID
area_id:区域ID
sku:是否返回指定区域SKU信息

响应参数

Version: Date:2022-04-04

名称类型必须示例值描述

items

items[]0商品快递费

 

响应示例


    "item": {
    "num_iid": "572050066584",
    "area_id": "152501",
    "location": "广东广州",
    "shipping_to": "",
    "express_fee": "快递: ¥6.00 ",
    "ems_fee": "",
    "post_fee": "6.00"
  },
  "secache": "5ec874b9545a616c20accabd2d814eee",
  "secache_time": 1691546564,
  "secache_date": "2023-08-09 10:02:44",
  "error": "",
  "reason": "",
  "error_code": "0000",
  "cache": 0,
  "api_info": "today:62 max:10100 all[91=62+25+20];expires:2030-12-31",
  "execution_time": "0.737",
  "server_time": "Beijing/2023-08-09 10:02:44",
  "client_ip": "220.177.181.75",
  "call_args": {
    "num_iid": "572050066584",
    "area_id": "152501",
    "sku": "0"
  },
  "api_type": "taobao",
  "translate_language": "zh-CN",
  "translate_engine": "baidu",
  "server_memory": "5.98MB",
  "request_id": "gw-1.64d2f3c43f3a3",
  "last_id": "1936818063"
  }

 异常示例

{
    "error": "item-not-found",
    "reason": "商品没找到",
    "error_code": "2000",
    "success": 0,
    "cache": 0,
    "api_info": "today:0 max:10000",
    "execution_time": 0.081,
    "server_time": "Beijing/2020-06-10 23:44:00",
    "call_args": [],
    "api_type": "taobao",
    "request_id": "15ee0ffc041242"}

错误码解释

状态代码(error_code)状态信息详细描述是否收费
0000success接口调用成功并返回相关数据
2000Search success but no result接口访问成功,但是搜索没有结果
4000Server internal error服务器内部错误
4001Network error网络错误
4002Target server error目标服务器错误
4003Param error用户输入参数错误忽略
4004Account not found用户帐号不存在忽略
4005Invalid authentication credentials授权失败忽略
4006API stopped您的当前API已停用忽略
4007Account stopped您的账户已停用忽略
4008API rate limit exceeded并发已达上限忽略
4009API maintenanceAPI维护中忽略
4010API not found with these valuesAPI不存在忽略
4012Please add api first请先添加api忽略
4013Number of calls exceeded调用次数超限忽略
4014Missing url param参数缺失忽略
4015Wrong pageToken参数pageToken有误忽略
4016Insufficient balance余额不足忽略
4017timeout error请求超时
5000unknown error未知错误
<think>我们正在分析一个SQL查询,该查询在ORDER BY子句中使用了SUM函数,这可能导致错误。根据SQL标准,ORDER BY子句通常不能直接使用聚合函数(如SUM)作为排序依据,除非在SELECT子句中已经计算了该聚合值。 观察用户提供的SQL查询,在ORDER BY子句中有: ORDER BY sum(a.det_item_fee_sumamt) desc 这种写法在大多数数据库系统中是不允许的,因为聚合函数在SELECT之后执行,而ORDER BY子句通常只能引用SELECT列表中的列或表达式(或使用列序号,但不推荐)。 为了修正这个问题,我们需要考虑: 1. 要么在SELECT子句中包含这个SUM表达式,然后按别名排序。 2. 要么使用窗口函数(如果不需要分组,而是整个结果集的排序)但这里显然是需要分组汇总的。 但是,请注意,查询中使用了GROUP BY子句,这意味着我们可以使用聚合函数在SELECT子句中,然后在ORDER BY子句中引用这个聚合值。 然而,观察当前查询的GROUP BY子句,它包含了很多列,但并没有对a.det_item_fee_sumamt进行求和。实际上,我们注意到在SELECT子句中,我们并没有对a.det_item_fee_sumamt进行求和,而是直接选择了a.det_item_fee_sumamt(作为费用总额)以及其他列。 问题在于:在GROUP BY子句中,我们按多个列分组,那么对于非分组列(如a.det_item_fee_sumamt)必须使用聚合函数。但是当前SELECT子句中直接使用了a.det_item_fee_sumamt,这会导致错误(除非该列在分组中唯一,但这里显然不是,因为一个分组可能有多个明细项)。 所以,这个查询实际上存在两个问题: 1. 在ORDER BY子句中直接使用SUM聚合函数,而没有在SELECT子句中先计算它。 2. 在SELECT子句中使用非聚合列(如a.det_item_fee_sumamt)而没有用聚合函数,而GROUP BY子句包含了多个列,这些非聚合列不在GROUP BY子句中(或者不在函数依赖的列中)会导致错误。 因此,我们需要重新审视这个查询的意图。 从查询的末尾来看,意图是“按费用总额的降序排序”,但这里的费用总额(a.det_item_fee_sumamt)是每一笔明细的费用,而ORDER BY子句却试图对明细费用求和(sum(a.det_item_fee_sumamt))然后排序。这可能是想按分组后的总费用排序?还是按每笔明细的费用排序? 结合上下文,查询中使用了GROUP BY,但GROUP BY的列非常多(几乎包括了所有在SELECT中出现的列,除了a.det_item_fee_sumamt等个别列),这样分组会导致每个分组只有一行(因为分组列几乎包含了所有列),那么求和就没有意义(每个分组内只有一条明细?)。这显然不是用户想要的。 实际上,从查询的SELECT子句来看,我们选择了大量列,包括明细级别的列(如商品名、规格、数量、单价等),因此这个查询应该是要展示每一笔费用明细,而不是汇总结果。那么为什么会有GROUP BY呢? 可能用户想要去重?但是GROUP BY子句包含了这么多列,实际上就是按所有列去重(因为分组后每组只有一行)。但这样会导致: - 如果有多条相同的明细,则合并为一条,但是费用总额(a.det_item_fee_sumamt)是相同的,所以合并后费用总额还是那个值,但是这样去重后,再按费用总额求和(sum(a.det_item_fee_sumamt))排序,实际上就是按该明细的费用总额排序(因为每个分组只有一条,所以求和就是它本身)。 所以,如果目的是按明细的费用总额降序排序,那么直接按a.det_item_fee_sumamt排序即可,不需要求和。因此,ORDER BY子句可以改为: ORDER BY a.det_item_fee_sumamt DESC 但是,为什么用户使用了SUM呢?可能是因为在分组的情况下,希望每个分组内的费用总额?但这里分组列太多,每个分组只有一条,所以求和就是它自己。 因此,修正方案有两种: 方案一:如果不需要分组,那么去掉GROUP BY子句,然后直接按a.det_item_fee_sumamt排序。 ORDER BY a.det_item_fee_sumamt DESC 方案二:如果需要分组(比如按某些列汇总),那么应该在SELECT子句中计算每个分组的总费用,然后按这个总费用排序。但这样就需要在SELECT子句中使用聚合函数,并且只选择分组列和聚合列。 根据查询的上下文,用户可能并不想汇总,而是想展示明细记录,然后按每笔明细的费用总额排序。因此,方案一更合理。 但是,我们注意到GROUP BY子句中包含了大量的列,这可能是为了确保去重?或者是因为数据库要求(比如MySQL的sql_mode=only_full_group_by)?如果用户确实需要按这些列分组(比如避免重复),那么我们可以保留GROUP BY,但这样每个分组只有一行,那么SUM(a.det_item_fee_sumamt)其实就等于a.det_item_fee_sumamt,所以我们可以改为: ORDER BY a.det_item_fee_sumamt DESC 另外,还有一个问题:在GROUP BY子句中,我们使用了TO_NCHAR(a.medins_list_name),但在SELECT子句中是a.medins_list_name(没有转换),这可能导致分组和选择不一致(在Oracle中,TO_NCHAR和原字符串可能被视为不同)。所以,如果使用GROUP BY,那么SELECT子句中的a.medins_list_name应该改为TO_NCHAR(a.medins_list_name)?或者反过来?这取决于数据库的字符集设置。 考虑到这个查询的复杂性,以及用户可能只是想按明细费用总额降序排列,我建议: 1. 去掉GROUP BY子句(如果不需要分组)和ORDER BY中的SUM,直接按明细费用总额排序。 2. 如果必须使用GROUP BY(比如为了去重),那么修改ORDER BY子句,直接使用a.det_item_fee_sumamt(因为每个分组只有一条,求和就是它自己)。 但是,我们注意到在GROUP BY子句中,我们按了a.fixmedins_code, PRIC, a.fixmedins_name, a.list_type, a.med_chrgitm_type, a.hilist_code, a.hilist_name, a.medins_list_codg, a.BKKP_SN, TO_NCHAR(a.medins_list_name)这么多列。其中,a.BKKP_SN(记账流水号)应该是唯一的,所以按这么多列分组后,每个分组确实只有一条记录。因此,我们可以直接使用a.det_item_fee_sumamt排序。 所以,修正后的ORDER BY子句为: ORDER BY a.det_item_fee_sumamt DESC 但是,为什么用户要写SUM呢?可能是因为最初想按某个汇总排序(比如按药品名称汇总总费用),但实际分组列太多,无法汇总。如果用户想按药品名称汇总总费用,那么分组列应该只包含药品名称,然后计算SUM(a.det_item_fee_sumamt),再按这个总和排序。但当前查询显然不是这样。 因此,我们按照用户当前的分组方式(即分组列几乎包含所有列),将ORDER BY子句改为直接使用明细费用总额。 另外,在GROUP BY子句中,我们注意到有一个中文逗号(,)在a.BKKP_SN后面,这会导致语法错误。应该改为英文逗号。 修正步骤: 1. 将GROUP BY子句中的中文逗号(,)改为英文逗号(,)。 2. 将ORDER BY子句中的`sum(a.det_item_fee_sumamt) desc`改为`a.det_item_fee_sumamt desc`。 修改后的GROUP BY子句: GROUP BY a.fixmedins_code, PRIC, a.fixmedins_name, a.list_type, a.med_chrgitm_type, a.hilist_code, a.hilist_name, a.medins_list_codg, a.BKKP_SN, -- 这里原来是中文逗号 TO_NCHAR(a.medins_list_name) 修改后的ORDER BY子句: ORDER BY a.det_item_fee_sumamt DESC 但是,这样修改后,我们注意到在SELECT子句中,我们选择了a.det_item_fee_sumamt(费用总额),而分组后每个分组只有一行,所以这个值就是该分组中唯一的一条记录的费用总额,因此按这个值排序是合理的。 另外,为什么在GROUP BY中使用了TO_NCHAR(a.medins_list_name)?这可能是为了在分组时避免字符集问题。但SELECT子句中直接使用了a.medins_list_name(原始列),这可能导致在有些数据库中出现不一致(因为分组依据是转换后的值)。为了保持一致,建议在SELECT子句中也使用TO_NCHAR(a.medins_list_name)或者将GROUP BY中的表达式改为a.medins_list_name(如果数据库支持直接按原列分组)。 由于我们不清楚数据库的具体设置,且用户可能希望显示原始列,所以可以在SELECT子句中使用a.medins_list_name,而GROUP BY子句中使用a.medins_list_name(去掉转换函数),除非有特殊原因必须转换。 因此,如果可能,将GROUP BY子句中的TO_NCHAR(a.medins_list_name)改为a.medins_list_name,以保持和SELECT子句一致。 综上,修正后的查询为: ```sql SELECT ... -- 省略其他列,与原始查询相同 a.DET_ITEM_FEE_SUMAMT AS 费用总额, a.INSCP_AMT AS 明细符合范围金额 FROM FEE_LIST_D a LEFT JOIN SETL_D b ON a.SETL_ID = b.SETL_ID AND a.FIXMEDINS_CODE = b.FIXMEDINS_CODE LEFT JOIN MDTRT_D c ON a.MDTRT_ID = c.MDTRT_ID AND a.FIXMEDINS_CODE = c.FIXMEDINS_CODE WHERE a.FIXMEDINS_CODE = 'H53050200009' AND b.year = '2023' GROUP BY a.fixmedins_code, PRIC, a.fixmedins_name, a.list_type, a.med_chrgitm_type, a.hilist_code, a.hilist_name, a.medins_list_codg, a.BKKP_SN, -- 注意这里改为英文逗号 a.medins_list_name -- 去掉TO_NCHAR,使用原列名(如果数据库支持,这样更一致) ORDER BY a.det_item_fee_sumamt DESC; -- 直接使用明细费用总额排序 ``` 注意:如果数据库不允许在GROUP BY子句中使用原列(因为可能是大文本字段),那么可能需要保留TO_NCHAR,但同时在SELECT子句中也使用TO_NCHAR(a.medins_list_name) AS medins_list_name。但这样会改变列的数据类型(变为国家字符集)。如果原始列是VARCHAR2,而TO_NCHAR将其转为NVARCHAR2,那么可能会影响应用程序。 因此,如果必须使用TO_NCHAR,那么建议在SELECT子句中也使用它: SELECT ... , TO_NCHAR(a.medins_list_name) AS medins_list_name, ... 但为了简化,我们假设不需要转换,直接使用原列名。 最后,我们修正了三个问题: 1. GROUP BY子句中的中文逗号改为英文逗号。 2. GROUP BY子句中的TO_NCHAR(a.medins_list_name)改为a.medins_list_name(保持与SELECT一致)。 3. ORDER BY子句改为直接使用a.det_item_fee_sumamt排序。 这样查询应该可以正确执行。 如果用户确实需要按分组后的总费用排序(即按某些列分组后,将组内所有明细的费用总额相加,然后按这个总和排序),那么就需要重新设计查询,在子查询中先分组求和,然后再排序。但根据当前查询的SELECT子句(选择了大量明细列),这显然不是用户想要的。 因此,我们按照上述修正。</think>### SQL ORDER BY子句中使用SUM函数的问题分析与修正 您的SQL查询在`ORDER BY`子句中使用`SUM(a.det_item_fee_sumamt)`存在两个核心问题: #### 问题分析 1. **聚合函数位置错误**(关键问题): - `SUM()`是聚合函数,但未在`SELECT`子句中使用 - 在`ORDER BY`中直接使用聚合函数违反SQL执行顺序[^1]: ``` 执行顺序:FROM → WHERE → GROUP BY → SELECT → ORDER BY ``` - 错误提示通常为:`"aggregate functions are not allowed in ORDER BY"` 2. **GROUP BY子句不完整**: - 在`SELECT`子句中包含`a.det_item_fee_sumamt`(费用总额),但未在`GROUP BY`中列出 - 违反SQL分组规则:非聚合列必须包含在`GROUP BY`中[^4] #### 修正方案 根据您的需求(按费用总额降序排序),有两种修正方法: **方案1:直接使用明细金额排序**(推荐) ```sql -- 修改ORDER BY部分(删除SUM函数) ORDER BY a.det_item_fee_sumamt DESC ``` *适用场景*:需展示每条明细记录时 **方案2:使用分组汇总排序** ```sql -- 修改SELECT和GROUP BY SELECT ... -- 其他字段 SUM(a.det_item_fee_sumamt) AS 总费用 -- 添加聚合字段 FROM ... GROUP BY ... -- 现有分组字段 a.det_item_fee_sumamt -- 添加此字段到GROUP BY ORDER BY 总费用 DESC; -- 使用别名排序 ``` *适用场景*:需按分组汇总值排序时 ### 修正后的完整SQL(采用方案1) ```sql SELECT ... -- 保持原SELECT字段不变 FROM FEE_LIST_D a LEFT JOIN SETL_D b ON ... LEFT JOIN MDTRT_D c ON ... WHERE ... -- 保持原WHERE条件 GROUP BY ... -- 保持原GROUP BY字段 ORDER BY a.det_item_fee_sumamt DESC; -- 关键修正点 ``` ### 关键知识点 1. **SQL执行顺序**: - 聚合函数(`SUM/AVG`等)必须在`SELECT`或`HAVING`中使用[^1] - `ORDER BY`只能引用`SELECT`中的列或表达式[^2] 2. **分组规则**: - 使用`GROUP BY`时,`SELECT`中的非聚合列必须包含在分组中[^4] - 错误示例:`SELECT name, SUM(sales) ... GROUP BY city`(name未分组) 3. **窗口函数替代方案**(如需保留明细并排序汇总值): ```sql SELECT ..., SUM(a.det_item_fee_sumamt) OVER() AS 总费用 -- 窗口函数 ORDER BY 总费用 DESC ``` 此方法不改变结果集行数[^3][^5] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值