查看完整版本: 各位大哥点评一下我的SQL

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]]

Fly.Hang 2008-1-11 21:00

:Q

winsoft 2008-1-11 21:20

:lol :lol

hellert 2008-1-11 22:06

跟先前有人贴的那个MM写的千行 SQL 不相上下 :lol

vender 2008-1-12 03:07

LS你的MM好pp啊

yongweisun 2008-1-12 04:43

用中文做字段名不错啊,比用缩写清爽多了。听说有些数据库上会出现奇怪的毛病。

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是啰唆,天下第一的代码精妙,精简!效率高!

spng 2008-1-12 11:04

:Q :Q 这么多,疯了

CodeCoolie 2008-1-15 12:12

牛。。。

x_uy_u_n 2008-1-15 21:39

删除了好多帖啊,怎么搞的.

罘詈 2008-1-28 14:18

进销存.....


木人帮LZ看,都不讨论技术啦?
:lol   确实看着有点晕....

CodeCoolie 2008-1-28 17:58

[quote]原帖由 [i]罘詈[/i] 于 2008-1-28 14:18 发表 [url=http://www.cnsw.org/bbs/redirect.php?goto=findpost&pid=323768&ptid=78338][img]http://www.cnsw.org/bbs/images/common/back.gif[/img][/url]
进销存.....


木人帮LZ看,都不讨论技术啦?
:lol   确实看着有点晕.... [/quote]

你不知道楼主是天下第一啊。。。大不敬。。。

shuihan20e 2008-2-1 17:40

很好,很强大

sunny_ldc 2008-5-7 20:17

太强了,,
笑死我了,,,
彻底崩溃,,,,,,

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);
页: [1]
查看完整版本: 各位大哥点评一下我的SQL