一个可以参考的动态sql,商品参数的个数不确定,需要写动态sql查询

54 阅读1分钟
-- 步骤1: 生成CASE语句的字符串
SELECT
	GROUP_CONCAT(DISTINCT CONCAT( 'GROUP_CONCAT(distinct IF(pp.ParamName =\'', g.ParamName, '\', pp.ParamValue,null ))  as \'', ParamName, '\'' ))  INTO @dynamic_sql_part
	
FROM
	ParamValue AS g
	LEFT JOIN trade.TG_Goods AS goods ON g.GoodsId = goods.id 
WHERE
	goods.StockDirId = 1240781591605960704;
-- 步骤2: 构建完整的动态SQL查询
SET @dynamic_sql = CONCAT( 'SELECT 
pr.`projectName` AS \'征集项目名称\',
pro.`stockDirName` AS \'采购目录\',
pro.packageNo AS \'包号\',
pro.`goodsRepName` AS \'商品名称\',
pro.goodsRepBrand AS \'品牌\', 
pro.model AS \'型号\',
pro.providerOrgName AS \'入围供应商名称\',
pro.quotePrice AS \'入围价格\', ', 
@dynamic_sql_part, 
' ,SUM(go.GoodsNum) AS \'成交量\',
MIN(go.Price) AS \'成交最低价\',
MAX(go.Price) AS \'成交最高价\',
SUM(go.TotalPrice)/NULLIF(SUM(go.GoodsNum), 0) AS \'成交均价\',
SUM(go.TotalPrice) AS \'成交总金额\',
pro.`goodsRepId`

FROM 
trade.TF_Orders o
INNER JOIN CGoods go ON go.CommerceId=o.Id
INNER JOIN goods pro ON pro.goodsRepId=go.GoodsId AND pro.repState=1 AND pro.operState=4 AND pro.editState=2
INNER JOIN ParamValue pp ON pp.GoodsId=pro.goodsRepId  
INNER JOIN `project` pr ON pr.`id`=o.`VarId`
WHERE o.State=6 AND pro.stockDirId=1242514875780173824
GROUP BY pro.goodsRepId;' );
-- 步骤3: (可选) 查看构建的SQL语句
SELECT
	@dynamic_sql;
	-- 步骤4: 准备并执行动态SQL
PREPARE stmt 
FROM
	@dynamic_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;