w1984721 2008-1-11 20:49
各位大哥点评一下我的SQL
我要构建一个查询,用户可以自由选择几种查询条件!
我为弄下面的SQL花了我一小时。不知道老大有更简便的方法吗,既一条SQL就解决问题!
UpdateData(1);
if((m_lDWID==0)&&(m_KindID=="")&&(m_lStoreID==0)&&(m_lYGID==0))
{//全部查询
sql="SELECT 商品排行.商品ID,商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 \
FROM 商品排行 GROUP BY 商品排行.商品ID,商品排行.商品编码, 商品排行.商品名称, 商品排行.单据类型 \
HAVING (((商品排行.单据类型)='销售单'))";
}
else if((m_lDWID>0)&&(m_KindID=="")&&(m_lStoreID==0)&&(m_lYGID==0))
{//按单位查询
sql.Format("SELECT 商品排行.商品ID,商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额, 商品排行.单位ID \
FROM 商品排行 GROUP BY 商品排行.商品ID,商品排行.商品编码, 商品排行.商品名称, 商品排行.单据类型, 商品排行.单位ID \
HAVING (((商品排行.单据类型)='销售单') AND ((商品排行.单位ID)=%d))",m_lDWID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID==0)&&(m_lYGID==0))
{//按类别查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.类别编码 like '%s')\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, 商品排行.类别编码",m_KindID);
}
else if((m_KindID=="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按仓库查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.仓库ID = %d)\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lStoreID);
}
else if((m_KindID=="")&&(m_lDWID==0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按员工查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.员工ID = %d)\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lYGID);
}
else if((m_KindID!="")&&(m_lDWID!=0)&&(m_lStoreID==0)&&(m_lYGID==0))
{//按单位,类别查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s')\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lDWID,m_KindID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按仓库,类别查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.仓库ID = %d AND 商品排行.类别编码 like '%s')\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lStoreID,m_KindID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按员工,类别查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.员工ID = %d AND 商品排行.类别编码 like '%s')\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lYGID,m_KindID);
}
else if((m_KindID=="")&&(m_lDWID>0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按单位,仓库查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.单位ID = %d AND 商品排行.仓库ID = %d)\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lDWID,m_lStoreID);
}
else if((m_KindID=="")&&(m_lDWID>0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按单位,员工查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.单位ID = %d AND 商品排行.员工ID = %d)\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lDWID,m_lYGID);
}
else if((m_KindID=="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID>0))
{//按仓库,员工查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.仓库ID = %d AND 商品排行.员工ID = %d)\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lStoreID,m_lYGID);
}
else if((m_KindID!="")&&(m_lDWID>0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按单位,类别,仓库查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s' AND 商品排行.仓库ID = %d)\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lDWID,m_KindID,m_lStoreID);
}
else if((m_KindID!="")&&(m_lDWID>0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按单位,类别,员工查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s' AND 商品排行.员工ID = %d)\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lDWID,m_KindID,m_lYGID);
}
else if((m_KindID=="")&&(m_lDWID>0)&&(m_lStoreID>0)&&(m_lYGID>0))
{//按仓库,单位,员工查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.仓库ID = %d AND 商品排行.单位ID = %d AND 商品排行.员工ID = %d)\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lStoreID,m_lDWID,m_lYGID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID>0))
{//按仓库,类别,员工查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.仓库ID = %d AND 商品排行.类别编码 like '%s' AND 商品排行.员工ID = %d)\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lStoreID,m_KindID,m_lYGID);
}
else if((m_KindID!="")&&(m_lDWID>0)&&(m_lStoreID>0)&&(m_lYGID>0))
{//按单位,类别,仓库,员工查询
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, Sum(商品排行.数量) AS 销售数量, Sum(商品排行.含税金额)/Sum(商品排行.数量) AS 销售均价, Sum(商品排行.含税金额) AS 销售金额 FROM 商品排行 \
where (商品排行.单据类型='销售单' AND 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s' AND 商品排行.仓库ID = %d AND 商品排行.员工ID = %d)\
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",m_lDWID,m_KindID,m_lStoreID,m_lYGID);
}
[[i] 本帖最后由 w1984721 于 2008-1-11 20:50 编辑 [/i]]
x_uy_u_n 2008-1-12 08:26
[quote]原帖由 [i]hellert[/i] 于 2008-1-11 22:06 发表 [url=http://www.cnsw.org/bbs/redirect.php?goto=findpost&pid=320246&ptid=78338][img]http://www.cnsw.org/bbs/images/common/back.gif[/img][/url]
跟先前有人贴的那个MM写的千行 SQL 不相上下 :lol [/quote]
差得远了,别人那MM一条语句,1000行,天下第一的,N条语句,才100行左右.
根据代码不同天下第一胜的原则,说明那MM是啰唆,天下第一的代码精妙,精简!效率高!
w1984721 2008-5-8 01:32
改进后的语句!
CString where="";
CString between="";
between.Format(" and 日期 between #%s# and #%s#",CPublic::Date1,CPublic::Date2);
UpdateData(1);
if((m_lDWID==0)&&(m_KindID=="")&&(m_lStoreID==0)&&(m_lYGID==0))
{//全部查询
between="";
where.Format("WHERE 日期 between #%s# and #%s#",CPublic::Date1,CPublic::Date2);
}
else if((m_lDWID>0)&&(m_KindID=="")&&(m_lStoreID==0)&&(m_lYGID==0))
{//按单位查询
where.Format("WHERE 商品排行.单位ID = %d",m_lDWID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID==0)&&(m_lYGID==0))
{//按类别查询
where.Format("WHERE 商品排行.类别编码 like '%s'",m_KindID);
}
else if((m_KindID=="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按仓库查询
where.Format("WHERE 商品排行.仓库ID = %d",m_lStoreID);
}
else if((m_KindID=="")&&(m_lDWID==0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按员工查询
where.Format("WHERE 商品排行.员工ID = %d",m_lYGID);
}
else if((m_KindID!="")&&(m_lDWID!=0)&&(m_lStoreID==0)&&(m_lYGID==0))
{//按单位,类别查询
where.Format("WHERE 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s'",m_lDWID,m_KindID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按仓库,类别查询
where.Format("WHERE 商品排行.仓库ID = %d AND 商品排行.类别编码 like '%s'",m_lStoreID,m_KindID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按员工,类别查询
where.Format("WHERE 商品排行.员工ID = %d AND 商品排行.类别编码 like '%s'",m_lYGID,m_KindID);
}
else if((m_KindID=="")&&(m_lDWID>0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按单位,仓库查询
where.Format("WHERE 商品排行.单位ID = %d AND 商品排行.仓库ID = %d",m_lDWID,m_lStoreID);
}
else if((m_KindID=="")&&(m_lDWID>0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按单位,员工查询
where.Format("WHERE 商品排行.单位ID = %d AND 商品排行.员工ID = %d",m_lDWID,m_lYGID);
}
else if((m_KindID=="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID>0))
{//按仓库,员工查询
where.Format("WHERE 商品排行.仓库ID = %d AND 商品排行.员工ID = %d",m_lStoreID,m_lYGID);
}
else if((m_KindID!="")&&(m_lDWID>0)&&(m_lStoreID>0)&&(m_lYGID==0))
{//按单位,类别,仓库查询
where.Format("WHERE 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s' AND 商品排行.仓库ID = %d",m_lDWID,m_KindID,m_lStoreID);
}
else if((m_KindID!="")&&(m_lDWID>0)&&(m_lStoreID==0)&&(m_lYGID>0))
{//按单位,类别,员工查询
where.Format("WHERE 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s' AND 商品排行.员工ID = %d",m_lDWID,m_KindID,m_lYGID);
}
else if((m_KindID=="")&&(m_lDWID>0)&&(m_lStoreID>0)&&(m_lYGID>0))
{//按仓库,单位,员工查询
where.Format("WHERE 商品排行.单位ID = %d AND 商品排行.仓库ID = %d AND 商品排行.员工ID = %d",m_lDWID,m_lStoreID,m_lYGID);
}
else if((m_KindID!="")&&(m_lDWID==0)&&(m_lStoreID>0)&&(m_lYGID>0))
{//按仓库,类别,员工查询
where.Format("WHERE 商品排行.仓库ID = %d AND 商品排行.类别编码 like '%s' AND 商品排行.员工ID = %d",m_lStoreID,m_KindID,m_lYGID);
}
else if((m_KindID!="")&&(m_lDWID>0)&&(m_lStoreID>0)&&(m_lYGID>0))
{//按单位,类别,仓库,员工查询
where.Format("WHERE 商品排行.单位ID = %d AND 商品排行.类别编码 like '%s' AND 商品排行.仓库ID = %d AND 商品排行.员工ID = %d",m_lDWID,m_KindID,m_lStoreID,m_lYGID);
}
where+=between;
sql.Format("SELECT 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称, \
Sum(商品排行.发生数量) AS 销售数量, \
Sum(商品排行.发生成本) AS 销售成本, \
Sum(商品排行.发生金额) AS 销售金额, \
Sum(商品排行.利润) AS 利润 ,\
IIf((SELECT Sum(商品排行.发生金额) FROM 商品排行 %s)=0,0,Sum(商品排行.发生金额)/(SELECT Sum(商品排行.发生金额) FROM 商品排行 %s)) AS 销售比重, \
IIf((SELECT Sum(商品排行.利润) FROM 商品排行 %s)=0,0,Sum(商品排行.利润)/(SELECT Sum(商品排行.利润) FROM 商品排行 %s)) AS 利润比重 \
FROM 商品排行 \
%s \
GROUP BY 商品排行.商品ID, 商品排行.商品编码, 商品排行.商品名称",where,where,where,where,where);