求一条SQL语句

时间:2022-09-08 15:16:48
查询出一段数据后判断记录里面的最大id是否大于a 查询语句如下:
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 from ProductData where ClassId=101 and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 and EPack='Window Box' order by id asc
 分数不多  求教各位大侠

18 个解决方案

#1



;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from cte t
where exists (select 1 from a where a.id>t.id)

#2


引用 楼主 bobo3358 的回复:
查询出一段数据后判断记录里面的最大id是否大于a 查询语句如下:
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 from ProductData where ClassId=101 and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 and EPack='Window Box' order by id asc
 分数不多  求教各位大侠


大于a,这个a是一个表,还是一个值呢

#3


引用 2 楼 yupeigu 的回复:
大于a,这个a是一个表,还是一个值呢

a 是一个值来的

#4


引用 1 楼 hdhai9451 的回复:

;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from cte t
where exists (select 1 from a where a.id>t.id)


我要的是比较表t里面的最大id 是不是大于a

#5


引用 3 楼 bobo3358 的回复:
Quote: 引用 2 楼 yupeigu 的回复:

大于a,这个a是一个表,还是一个值呢

a 是一个值来的


是这样吗:
;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select case when max(id) > a then '最大id大于a' else '最大id不大于a' end
from cte t

#6


引用 2 楼 yupeigu 的回复:
大于a,这个a是一个表,还是一个值呢

我之前是这样写的:

select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 from ProductData where 
ClassId=101 and BoxContain >0 and BoxContain is not null and 
round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0 And 
round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 and 
(0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 and 
(0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 and 
CPack='Window Box' and max(id)> a order by id desc

但是这样写会报错,我是想知道后面那句where条件该怎么写

#7


引用 6 楼 bobo3358 的回复:
Quote: 引用 2 楼 yupeigu 的回复:

大于a,这个a是一个表,还是一个值呢

我之前是这样写的:

select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 from ProductData where 
ClassId=101 and BoxContain >0 and BoxContain is not null and 
round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0 And 
round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 and 
(0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 and 
(0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 and 
CPack='Window Box' and max(id)> a order by id desc

但是这样写会报错,我是想知道后面那句where条件该怎么写


你要的就是最大的id 大于a的,那么就把id是最大值的那些记录返回是把:



;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from
(
select *,
       max(id) over(partition by 1) as max_id, 
       dense_rank() over(order by id)  as rownum
from cte
)t
where t.rownum = 1 and t.max_id >1

#8


最后那个写错了 应该是max_id > a




;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from
(
select *,
       max(id) over(partition by 1) as max_id, 
       dense_rank() over(order by id)  as rownum
from cte
)t
where t.rownum = 1 and t.max_id > a

#9


再修改一下,按id降序排列:





;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from
(
select *,
       max(id) over(partition by 1) as max_id, 
       dense_rank() over(order by id desc)  as rownum
from cte
)t
where t.rownum = 1 and t.max_id > a


#10


这样吧,我把整段代码贴出来

//last 是个int,第一次调用时为0,查询完成后再把查询出来的数据Id值最大的那条数据的id值保存到last里面,第二次调用这个查询语句的时候就要查询id值比last大的数据,再保存最大id值到last里面供第三次调用时使用,如此循环下去
StringBuilder sb=new StringBuilder();
if (pack.Equals(""))
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup );

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }
                }
                else
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup + " and EPack='" + pack + "'");

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }

#11


引用 2 楼 yupeigu 的回复:
大于a,这个a是一个表,还是一个值呢

大概意思就是像上面我描述的这样

#12


引用 10 楼 bobo3358 的回复:
这样吧,我把整段代码贴出来

//last 是个int,第一次调用时为0,查询完成后再把查询出来的数据Id值最大的那条数据的id值保存到last里面,第二次调用这个查询语句的时候就要查询id值比last大的数据,再保存最大id值到last里面供第三次调用时使用,如此循环下去
StringBuilder sb=new StringBuilder();
if (pack.Equals(""))
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup );

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }
                }
                else
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup + " and EPack='" + pack + "'");

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }


确实像你说的,在原来的语句后面直接加上 and max(id) > a 肯定是要报错的。

你想达到的效果是,你top 200查询出来的记录,计算max(id)值,如果>a,返回返回这200条记录,如果不大于a,那么返回0条记录,是这样吗?

#13


引用 12 楼 yupeigu 的回复:
Quote: 引用 10 楼 bobo3358 的回复:

这样吧,我把整段代码贴出来

//last 是个int,第一次调用时为0,查询完成后再把查询出来的数据Id值最大的那条数据的id值保存到last里面,第二次调用这个查询语句的时候就要查询id值比last大的数据,再保存最大id值到last里面供第三次调用时使用,如此循环下去
StringBuilder sb=new StringBuilder();
if (pack.Equals(""))
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup );

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }
                }
                else
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup + " and EPack='" + pack + "'");

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }


确实像你说的,在原来的语句后面直接加上 and max(id) > a 肯定是要报错的。

你想达到的效果是,你top 200查询出来的记录,计算max(id)值,如果>a,返回返回这200条记录,如果不大于a,那么返回0条记录,是这样吗?

是的 就是这个意思,我之前没有描述清楚,导致你们误会,真的不好意思,浪费你们时间

#14


呵呵,没关系啦,现在首先是要让语句运行出来的结果是你想要的:


;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from
(
select *,
   max(id) over(partition by 1) as max_id
from cte
)t
where t.max_id > a

#15


引用 14 楼 yupeigu 的回复:
呵呵,没关系啦,现在首先是要让语句运行出来的结果是你想要的:


;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from
(
select *,
   max(id) over(partition by 1) as max_id
from cte
)t
where t.max_id > a

这里使用的是CTE吧?我的服务器数据库还是2000,不支持CTE,有其它写法吗

#16


哦 ,2000啊,稍微麻烦一点,这样:



select *
from 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
order by id asc
)t
where
(
select max(id) 
    from
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
         order by id asc
)t
) > a

#17


引用 16 楼 yupeigu 的回复:
哦 ,2000啊,稍微麻烦一点,这样:



select *
from 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
order by id asc
)t
where
(
select max(id) 
    from
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
         order by id asc
)t
) > a

谢谢了 这就是我想要的结果,散分

#18


;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)
 
select *
from cte t
where exists (select 1 from a where a.id>t.id)

#1



;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from cte t
where exists (select 1 from a where a.id>t.id)

#2


引用 楼主 bobo3358 的回复:
查询出一段数据后判断记录里面的最大id是否大于a 查询语句如下:
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 from ProductData where ClassId=101 and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 and EPack='Window Box' order by id asc
 分数不多  求教各位大侠


大于a,这个a是一个表,还是一个值呢

#3


引用 2 楼 yupeigu 的回复:
大于a,这个a是一个表,还是一个值呢

a 是一个值来的

#4


引用 1 楼 hdhai9451 的回复:

;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from cte t
where exists (select 1 from a where a.id>t.id)


我要的是比较表t里面的最大id 是不是大于a

#5


引用 3 楼 bobo3358 的回复:
Quote: 引用 2 楼 yupeigu 的回复:

大于a,这个a是一个表,还是一个值呢

a 是一个值来的


是这样吗:
;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select case when max(id) > a then '最大id大于a' else '最大id不大于a' end
from cte t

#6


引用 2 楼 yupeigu 的回复:
大于a,这个a是一个表,还是一个值呢

我之前是这样写的:

select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 from ProductData where 
ClassId=101 and BoxContain >0 and BoxContain is not null and 
round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0 And 
round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 and 
(0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 and 
(0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 and 
CPack='Window Box' and max(id)> a order by id desc

但是这样写会报错,我是想知道后面那句where条件该怎么写

#7


引用 6 楼 bobo3358 的回复:
Quote: 引用 2 楼 yupeigu 的回复:

大于a,这个a是一个表,还是一个值呢

我之前是这样写的:

select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 from ProductData where 
ClassId=101 and BoxContain >0 and BoxContain is not null and 
round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0 And 
round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 and 
(0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 and 
(0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 and 
CPack='Window Box' and max(id)> a order by id desc

但是这样写会报错,我是想知道后面那句where条件该怎么写


你要的就是最大的id 大于a的,那么就把id是最大值的那些记录返回是把:



;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from
(
select *,
       max(id) over(partition by 1) as max_id, 
       dense_rank() over(order by id)  as rownum
from cte
)t
where t.rownum = 1 and t.max_id >1

#8


最后那个写错了 应该是max_id > a




;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from
(
select *,
       max(id) over(partition by 1) as max_id, 
       dense_rank() over(order by id)  as rownum
from cte
)t
where t.rownum = 1 and t.max_id > a

#9


再修改一下,按id降序排列:





;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from
(
select *,
       max(id) over(partition by 1) as max_id, 
       dense_rank() over(order by id desc)  as rownum
from cte
)t
where t.rownum = 1 and t.max_id > a


#10


这样吧,我把整段代码贴出来

//last 是个int,第一次调用时为0,查询完成后再把查询出来的数据Id值最大的那条数据的id值保存到last里面,第二次调用这个查询语句的时候就要查询id值比last大的数据,再保存最大id值到last里面供第三次调用时使用,如此循环下去
StringBuilder sb=new StringBuilder();
if (pack.Equals(""))
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup );

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }
                }
                else
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup + " and EPack='" + pack + "'");

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }

#11


引用 2 楼 yupeigu 的回复:
大于a,这个a是一个表,还是一个值呢

大概意思就是像上面我描述的这样

#12


引用 10 楼 bobo3358 的回复:
这样吧,我把整段代码贴出来

//last 是个int,第一次调用时为0,查询完成后再把查询出来的数据Id值最大的那条数据的id值保存到last里面,第二次调用这个查询语句的时候就要查询id值比last大的数据,再保存最大id值到last里面供第三次调用时使用,如此循环下去
StringBuilder sb=new StringBuilder();
if (pack.Equals(""))
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup );

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }
                }
                else
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup + " and EPack='" + pack + "'");

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }


确实像你说的,在原来的语句后面直接加上 and max(id) > a 肯定是要报错的。

你想达到的效果是,你top 200查询出来的记录,计算max(id)值,如果>a,返回返回这200条记录,如果不大于a,那么返回0条记录,是这样吗?

#13


引用 12 楼 yupeigu 的回复:
Quote: 引用 10 楼 bobo3358 的回复:

这样吧,我把整段代码贴出来

//last 是个int,第一次调用时为0,查询完成后再把查询出来的数据Id值最大的那条数据的id值保存到last里面,第二次调用这个查询语句的时候就要查询id值比last大的数据,再保存最大id值到last里面供第三次调用时使用,如此循环下去
StringBuilder sb=new StringBuilder();
if (pack.Equals(""))
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup );

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }
                }
                else
                {
                    sb.Append("select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack," + formula + " from ProductData");
                    sb.Append(" where ClassId=" + classid + " and BoxContain >0 and BoxContain is not null and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=" + volumeAreaDown + " And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= " + volumeareaup + " and (" + formula + ") >=" + pricedown + " and (" + formula + ") <=" + priceup + " and EPack='" + pack + "'");

                    if (last == 0)
                    {
                        sb.Append(" order by id desc");
                    }
                    else
                    {
                        sb.Append(" and Max(id) >" + last + " order by id asc");
                    }


确实像你说的,在原来的语句后面直接加上 and max(id) > a 肯定是要报错的。

你想达到的效果是,你top 200查询出来的记录,计算max(id)值,如果>a,返回返回这200条记录,如果不大于a,那么返回0条记录,是这样吗?

是的 就是这个意思,我之前没有描述清楚,导致你们误会,真的不好意思,浪费你们时间

#14


呵呵,没关系啦,现在首先是要让语句运行出来的结果是你想要的:


;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from
(
select *,
   max(id) over(partition by 1) as max_id
from cte
)t
where t.max_id > a

#15


引用 14 楼 yupeigu 的回复:
呵呵,没关系啦,现在首先是要让语句运行出来的结果是你想要的:


;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)

select *
from
(
select *,
   max(id) over(partition by 1) as max_id
from cte
)t
where t.max_id > a

这里使用的是CTE吧?我的服务器数据库还是2000,不支持CTE,有其它写法吗

#16


哦 ,2000啊,稍微麻烦一点,这样:



select *
from 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
order by id asc
)t
where
(
select max(id) 
    from
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
         order by id asc
)t
) > a

#17


引用 16 楼 yupeigu 的回复:
哦 ,2000啊,稍微麻烦一点,这样:



select *
from 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
order by id asc
)t
where
(
select max(id) 
    from
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
         order by id asc
)t
) > a

谢谢了 这就是我想要的结果,散分

#18


;with cte as 
(
select top 200 id, ClassId,Name,Price,BoxContain,BoxLength,BoxWidth,BoxHeight,CName,EName,CPack,PhotoFolder,EPack,
0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08 
from ProductData 
where ClassId=101 and BoxContain >0 and BoxContain is not null 
and round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) >=0
 And round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3) <= 10000 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) >=10 
 and (0.46*(round(((convert(decimal(10,2),BoxLength)*convert(decimal(10,2),BoxWidth) * convert(decimal(10,2),BoxHeight))/1000000),3))*35.32/BoxContain+Price/6*1.08) <=1000 
 and EPack='Window Box' 
 order by id asc
)
 
select *
from cte t
where exists (select 1 from a where a.id>t.id)