好几条记录只是仓位及数量不同,其它内容都一样,现在要显示出一条来,仓位及数量用"/"分开

本文介绍了一种使用SQL函数来聚合特定字段的方法,展示了如何通过自定义函数实现数据的整合与展示,对比了两种不同的SQL实现方式及其可能的性能差异。

如   A:
ID       GoodsId         GoodsName         Position       Amount
1         FBM                    方便面                  01                200
2         FBM                    方便面                  02                411
3         FBM                    方便面                  03                458
4         NN                      牛  奶                    04                100
5         NN                      牛  奶                    05                562
6         NN                      牛  奶                    06                248
....
如 B:
现在要显示下面这样
GoodsID   GoodsName       Position              Amount
FBM            方便面                 01/02/03            200/411/458
NN              牛  奶                   04/05/06            100/562/248
....

实现这种有两种方法

一种就是在数据库端写Sql语句来实现;

另一种就是把要的全都取出来,然后在.cs文件里写代码进行处理后邦定到DataGrid(GridView,DataList,等)中去。

 后一种就不用说了,主要是说一下第一种用一句Sql语句来实现.

首先建两个函数,通过传入参数的方面返回要的结束,如B中Position那样

/*
   获取仓位
*/

CREATE FUNCTION [dbo].[Get_StorePos] 
(
    
@CompanyId varchar(20),
    
@GoodsId varchar(20)
)  
RETURNS varchar(8000AS  
BEGIN 
declare @storePos varchar(8000)
    
set @storePos = ''
    
select @storePos = @storePos + storePos + '/' from  View_GoodsBaseInfo_1 where CompanyId = @CompanyId and goodsId = @GoodsId
    
return @storePos;
END
go
/*
获取数量
*/

CREATE FUNCTION [dbo].[Get_storeQty] 
(
    
@CompanyId varchar(20),
    
@GoodsId varchar(20)
)  
RETURNS varchar(8000AS  
BEGIN 
    
declare @storeQty varchar(8000)
    
set @storeQty = ''
    
select @storeQty = @storeQty + convert(varchar(20),storeQty) + '/' from  View_GoodsBaseInfo_1 where CompanyId = @CompanyId and goodsId = @GoodsId
    
return @storeQty;
END


下面是那条Sql语句,是用来显示内容如B那种。
--显示出结果
select 
*, dbo.Get_StorePos(a.CompanyId,a.GoodsId) as storePos ,dbo.Get_storeQty(a.CompanyId,a.GoodsId) as StoreQty from (
    select DISTINCT companyId,goodsId,GoodName,PackageFmt,SUnitName,price,SaleFmt,CacuBaseParam,TaxRate
    from View_GoodsBaseInfo_1
)
as a

下面这条Sql语句的执行效率不知道比上面那条快呢?
select companyId,GoodsId,GoodName,PackageFmt,SUnitName,price,SaleFmt,CacuBaseParam,TaxRate,storePos=dbo.Get_StorePos(CompanyId,GoodsId),storeQty=dbo.Get_storeQty(CompanyId,GoodsId)
from View_GoodsBaseInfo_1 
group by  companyId,GoodsId,GoodName,PackageFmt,SUnitName,price,SaleFmt,CacuBaseParam,TaxRate
order by GoodsId



有人说下面那条要快,可是我个人觉得差不多。
也许可能是我的知识有限吧,还有就是我的测试数据太少
它们的开销什么的都一样。

--- ## ✅ 功能目标: - 将“仓位”字段改为百分比格式(如 `50%`) - 提交数据时检查所有仓位总和是否超过 `100%` - 如果超过,提示用户并阻止提交 - 数据库中仍保留原始浮点数,前端显示时格式化为百分比 --- ## ✅ 修改说明: 1. **修改前端输入框**:允许输入百分比(如 `30%` 或 `0.3`),但统一转换为浮点数存储 2. **新增校验逻辑**:在插入新数据前,检查所有仓位总和是否超过 `1.0`(即 100%) 3. **格式化显示**:在显示数据表时,将 `0.3` 转换为 `30%` 4. **增强用户提示**:如果总仓位超过 100%,提示用户并禁止提交 --- ## ✅ 修改后的完整代码如下: ```php <?php /* Plugin Name: 手动输入表单 Plugin URI: https://example.com/manual-input-form Description: 提供一个短代码 [manual_input_form],用于在页面中显示提交品种、仓位、方向的表单,并将数据写入数据库仓位以百分比形式显示,总仓位能超过100%。 Version: 1.4 Author: Your Name Author URI: https://example.com License: GPL2 */ if (!defined('ABSPATH')) { exit; // 防止直接访问 } // 注册激活插件时自动创建数据库表 register_activation_hook(__FILE__, 'mif_create_shoudong_table'); function mif_create_shoudong_table() { global $wpdb; $table_name = $wpdb->prefix . 'shoudong'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE IF NOT EXISTS $table_name ( id INT AUTO_INCREMENT PRIMARY KEY, var VARCHAR(255) NOT NULL, cangwei FLOAT NOT NULL, fangxiang INT NOT NULL ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); } // 短代码处理函数 function manual_input_form_shortcode() { global $wpdb; $message = ''; $show_data = false; $table_name = $wpdb->prefix . 'shoudong'; // 数据提交处理 if (isset($_POST['submit_data'])) { $var = sanitize_text_field($_POST['var']); // 品种 $cangwei_input = sanitize_text_field($_POST['cangwei']); // 仓位输入 $fangxiang = intval($_POST['fangxiang']); // 方向 // 处理仓位输入:允许输入百分比(如 30%)或小数(如 0.3) $cangwei = 0.0; if (strpos($cangwei_input, '%') !== false) { $cangwei = floatval(str_replace('%', '', $cangwei_input)) / 100; } else { $cangwei = floatval($cangwei_input); } if (empty($var)) { $message = '品种能为空'; } elseif ($cangwei <= 0) { $message = '仓位必须大于0'; } else { // 获取当前总仓位 $total_cangwei = $wpdb->get_var("SELECT SUM(cangwei) FROM $table_name"); $total_cangwei = floatval($total_cangwei); // 检查总仓位是否会超过100% if ($total_cangwei + $cangwei > 1.0) { $message = '总仓位能超过100%!当前总仓位为:' . number_format($total_cangwei * 100, 2) . '%'; } else { $result = $wpdb->insert( $table_name, array( 'var' => $var, 'cangwei' => $cangwei, 'fangxiang' => $fangxiang ), array( '%s', // var 字段是字符串 '%f', // cangwei 是浮点数 '%d' // fangxiang 是整数 ) ); if ($result) { $message = '数据提交成功!'; } else { $message = '数据提交失败,请重试。'; } } } } // 清空数据操作 if (isset($_POST['clear_data'])) { check_admin_referer('clear_shoudong_data'); // 安全检查 $wpdb->query("TRUNCATE TABLE $table_name"); $message = '数据库已清空!'; } // 显示/隐藏数据操作 if (isset($_POST['toggle_data'])) { $show_data = isset($_POST['show_data']) && $_POST['show_data'] == '1'; } ob_start(); ?> <div class="manual-form"> <?php if ($message): ?> <p style="color: green;"><?php echo esc_html($message); ?></p> <?php endif; ?> <form method="post" action=""> <p> <label>品种: <input type="text" name="var" required> </label> </p> <p> <label>仓位 (支持百分比,如 30%): <input type="text" name="cangwei" placeholder="例如:30%" required> </label> </p> <p> <label>方向 (1为买,-1为卖): <input type="number" name="fangxiang" min="-1" max="1" required> </label> </p> <p> <input type="submit" name="submit_data" value="提交"> </p> </form> <form method="post" action="" style="margin-top: 20px;"> <input type="hidden" name="show_data" id="show_data_input" value="<?php echo $show_data ? '1' : '0'; ?>"> <?php wp_nonce_field('clear_shoudong_data'); ?> <input type="submit" name="toggle_data" value="显示全部"> <input type="submit" name="clear_data" value="清空全部" onclick="return confirm('确定要清空所有数据吗?');"> </form> <?php if ($show_data): ?> <div id="data-table" style="margin-top: 20px;"> <h3>当前数据列表</h3> <?php $results = $wpdb->get_results("SELECT * FROM $table_name", ARRAY_A); if ($results): ?> <table border="1" cellpadding="10"> <thead> <tr> <th>ID</th> <th>品种</th> <th>仓位 (%)</th> <th>方向</th> </tr> </thead> <tbody> <?php foreach ($results as $row): ?> <tr> <td><?php echo esc_html($row['id']); ?></td> <td><?php echo esc_html($row['var']); ?></td> <td><?php echo esc_html(number_format($row['cangwei'] * 100, 2) . '%'); ?></td> <td><?php echo esc_html($row['fangxiang']); ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php else: ?> <p>当前没有数据。</p> <?php endif; ?> </div> <?php endif; ?> </div> <script> document.querySelector('[name="toggle_data"]').addEventListener('click', function(e) { var input = document.getElementById('show_data_input'); input.value = input.value === '0' ? '1' : '0'; }); </script> <?php return ob_get_clean(); } add_shortcode('manual_input_form', 'manual_input_form_shortcode'); ``` --- ## ✅ 关键修改说明: | 修改点 | 说明 | |--------|------| | 仓位输入支持百分比 | 输入 `30%` 或 `0.3`,都会统一为浮点数 `0.3` 存入数据库 | | 总仓位限制逻辑 | 提交新数据前会查询当前总仓位,判断是否会超过 100% | | 仓位显示格式化 | 显示时将 `0.3` 格式化为 `30.00%` | | 用户提示增强 | 如果总仓位超过限制,提示当前总仓位并阻止提交 | --- ## ✅ 使用方式: 1. 更新插件文件内容。 2. 页面中插入短代码 `[manual_input_form]` 3. 测试输入: - 输入 `30%` 或 `0.3` 都可以 - 当总仓位超过 100% 时会提示并阻止提交 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值