我花了两小时写的SQL!大家说说如何改进才能好维护
也就是一个商品销售排行查询。难点是要计算利润,销售的百分比重。还要能灵活的根据单位,商品类别,仓库,员工进行多种条件查询。SQL写的太乱了,不知道如何简化?
void CSPXSPH::MakeSQL()
{
UpdateData(1);
if((m_lDWID==0)&&(m_KindID=="")&&(m_lStoreID==0)&&(m_lYGID==0))
{//全部查询
sql="SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 ) AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行)=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行)) AS 利润比重 \
FROM 商品排行 GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称";
}
else if((m_lDWID>0)&&(m_KindID=="")&&(m_lStoreID==0)&&(m_lYGID==0))
{//按单位查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 WHERE 商品排行.单位ID = %d) AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.单位ID = %d)=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.单位ID = %d)) AS 利润比重 \
FROM 商品排行 \
WHERE 商品排行.单位ID = %d \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lDWID,m_lDWID,m_lDWID,m_lDWID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID==0)&&(m_lYGID==0))
{//按类别查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 WHERE 商品排行.类别编码 like '%s') AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.类别编码 like '%s')=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.类别编码 like '%s')) AS 利润比重 \
FROM 商品排行 \
WHERE 商品排行.类别编码 like '%s' \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_KindID,m_KindID,m_KindID,m_KindID);
}
else if((m_KindID=="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按仓库查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 WHERE 商品排行.仓库ID = %d) AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.仓库ID = %d)=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.仓库ID = %d)) AS 利润比重 \
FROM 商品排行 \
WHERE 商品排行.仓库ID = %d \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lStoreID,m_lStoreID,m_lStoreID,m_lStoreID);
}
else if((m_KindID=="")&&(m_lDWID==0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按员工查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 WHERE 商品排行.员工ID = %d) AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.员工ID = %d)=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.员工ID = %d)) AS 利润比重 \
FROM 商品排行 \
WHERE 商品排行.员工ID = %d \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lYGID,m_lYGID,m_lYGID,m_lYGID);
}
else if((m_KindID!="")&&(m_lDWID!=0)&&(m_lStoreID==0)&&(m_lYGID==0))
{//按单位,类别查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 WHERE 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s') AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s')=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s')) AS 利润比重 \
FROM 商品排行 \
WHERE 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s' \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lDWID,m_KindID,m_lDWID,m_KindID,m_lDWID,m_KindID,m_lDWID,m_KindID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按仓库,类别查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 WHERE 商品排行.仓库ID = %d AND 商品排行.类别编码 like '%s' ) AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.仓库ID = %d AND 商品排行.类别编码 like '%s')=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.仓库ID = %d AND 商品排行.类别编码 like '%s')) AS 利润比重 \
FROM 商品排行 \
WHERE 商品排行.仓库ID = %d AND 商品排行.类别编码 like '%s' \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lStoreID,m_KindID,m_lStoreID,m_KindID,m_lStoreID,m_KindID,m_lStoreID,m_KindID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按员工,类别查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 WHERE 商品排行.员工ID = %d AND 商品排行.类别编码 like '%s') AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.员工ID = %d AND 商品排行.类别编码 like '%s')=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.员工ID = %d AND 商品排行.类别编码 like '%s')) AS 利润比重 \
FROM 商品排行 \
WHERE 商品排行.员工ID = %d AND 商品排行.类别编码 like '%s' \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lYGID,m_KindID,m_lYGID,m_KindID,m_lYGID,m_KindID,m_lYGID,m_KindID);
}
else if((m_KindID=="")&&(m_lDWID>0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按单位,仓库查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 WHERE 商品排行.单位ID = %d AND 商品排行.仓库ID = %d) AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.单位ID = %d AND 商品排行.仓库ID = %d)=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.单位ID = %d AND 商品排行.仓库ID = %d)) AS 利润比重 \
FROM 商品排行 \
WHERE 商品排行.单位ID = %d AND 商品排行.仓库ID = %d \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lDWID,m_lStoreID,m_lDWID,m_lStoreID,m_lDWID,m_lStoreID,m_lDWID,m_lStoreID);
}
else if((m_KindID=="")&&(m_lDWID>0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按单位,员工查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 WHERE 商品排行.单位ID = %d AND 商品排行.员工ID = %d) AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.单位ID = %d AND 商品排行.员工ID = %d)=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.单位ID = %d AND 商品排行.员工ID = %d)) AS 利润比重 \
FROM 商品排行 \
WHERE 商品排行.单位ID = %d AND 商品排行.员工ID = %d \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lDWID,m_lYGID,m_lDWID,m_lYGID,m_lDWID,m_lYGID,m_lDWID,m_lYGID);
}
else if((m_KindID=="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID>0))
{//按仓库,员工查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.数量) AS 销售数量, \
Sum(商品排行.销售成本) AS 销售成本, \
Sum(商品排行.含税金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
Sum(商品排行.含税金额)/(SELECT Sum(商品排行.含税金额) FROM 商品排行 WHERE 商品排行.仓库ID = %d AND 商品排行.员工ID = %d) AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.仓库ID = %d AND 商品排行.员工ID = %d)=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 WHERE 商品排行.仓库ID = %d AND 商品排行.员工ID = %d)) AS 利润比重 \
FROM 商品排行 \
WHERE 商品排行.仓库ID = %d AND 商品排行.员工ID = %d \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lStoreID,m_lYGID,m_lStoreID,m_lYGID,m_lStoreID,m_lYGID,m_lStoreID,m_lYGID);
}
[ 本帖最后由 w1984721 于 2008-1-12 17:18 编辑 ]