请问这样显示结果该如何写语句?

LoveMosquito 2007-10-19 10:56:27
原信息
qid cid pid ptid pbid ptName pbName Model comName pName QuotePrice QuoteTime ModPerson
11 2 8 9 10 mp4 爱国者 F335 九天成通 爱国者视觉王 5000.0 2007-10-18 15:22:49.000 Admin
10 1 8 9 10 mp4 爱国者 F335 九洲嘉园 爱国者视觉王 1000.0 2007-10-18 15:22:38.000 Admin
5 3 8 9 10 mp4 爱国者 F335 测试公司 爱国者视觉王 1500.0 2007-10-18 15:21:03.000 Admin
3 3 6 6 10 数码相机 爱国者 DC-V800 测试公司 爱国者数码相机 500.0 2007-10-18 15:22:01.000 Admin
7 2 6 6 10 数码相机 爱国者 DC-V800 九天成通 爱国者数码相机 8000.0 2007-10-18 15:21:43.000 Admin
6 1 6 6 10 数码相机 爱国者 DC-V800 九洲嘉园 爱国者数码相机 1000.0 2007-10-18 15:21:35.000 Admin
9 3 7 8 9 mp3 纽曼 F99 测试公司 纽曼之音 1000.0 2007-10-18 15:22:28.000 Admin
8 1 7 8 9 mp3 纽曼 F99 九洲嘉园 纽曼之音 500.0 2007-10-18 15:22:16.000 Admin
4 2 7 8 9 mp3 纽曼 F99 九天成通 纽曼之音 1000.0 2007-10-18 15:20:54.000 Admin

修改后变成
qid cid pid ptid pbid ptName pbName pName Model comName1 Price1 comName2 Price2 comName3 Price3 QuoteTime ModPerson
1 2 8 9 10 mp4 爱国者 视觉王 F335 九洲嘉园 1000.0 测试公司 1500.0 九天成通 5000.0 2007-10-18 15:22:49.000 Admin
2 3 6 6 10 数码相机 爱国者 视觉王 DC-V800 测试公司 500.0 九天成通 1000.0 九洲嘉园 8000.0 2007-10-18 15:22:49.000 Admin
....

合并条件是 同产品 同条件 同日期 price是最低价格取3个 最低的放到price1 然后是2和3,排序按时间 然后是产品名称,请问能应该怎么实现啊。
...全文
133 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LoveMosquito 2007-10-22
  • 打赏
  • 举报
回复
谢谢哦,解决了。
dawugui 2007-10-19
  • 打赏
  • 举报
回复
select px=(select count(1) from @tab where b=a.b and c<a.c)+1 , a,b,c from @tab a
order by b , c

你使用这句就行了,自己更改对应的字段.

上面的数据是测试数据,你不用输入饿.
LoveMosquito 2007-10-19
  • 打赏
  • 举报
回复
declare @tab table(a int,b varchar(2),c int)

insert @tab values(7,'aa',153)
insert @tab values(9,'aa',152)
insert @tab values(6,'aa',120)
insert @tab values(8,'aa',168)
insert @tab values(5,'bb',159)
insert @tab values(7,'bb',179)
insert @tab values(8,'bb',149)
insert @tab values(9,'bb',139)
insert @tab values(6,'bb',169)


这里怎么把原表的数据写进去呢?
我知道用while begin 但是不知道具体怎么写
while 到什么条件终止?

是先select …… go while 条件 …… begin吗?
dawugui 2007-10-19
  • 打赏
  • 举报
回复
--用此例的方法生成一个子表.
有一表
a b c
7 aa 153
9 aa 152
6 aa 120
8 aa 168
5 bb 159
7 bb 179
8 bb 149
9 bb 139
6 bb 169
对b列中的值来分类排序并分别加一序号,形成一新表
px a b c
1 6 aa 120
2 9 aa 152
3 7 aa 153
4 8 aa 168
1 9 bb 139
2 8 bb 149
3 5 bb 159
4 6 bb 169
5 7 bb 179


declare @tab table(a int,b varchar(2),c int)

insert @tab values(7,'aa',153)
insert @tab values(9,'aa',152)
insert @tab values(6,'aa',120)
insert @tab values(8,'aa',168)
insert @tab values(5,'bb',159)
insert @tab values(7,'bb',179)
insert @tab values(8,'bb',149)
insert @tab values(9,'bb',139)
insert @tab values(6,'bb',169)

select * from @tab

select px=(select count(1) from @tab where b=a.b and c<a.c)+1 , a,b,c from @tab a
order by b , c

px a b c
----------- ----------- ---- -----------
1 6 aa 120
2 9 aa 152
3 7 aa 153
4 8 aa 168
1 9 bb 139
2 8 bb 149
3 5 bb 159
4 6 bb 169
5 7 bb 179

(所影响的行数为 9 行)


在上面例中我们看到,以B分类排序,C是从小到大,如果C从大到小排序,即下面结果:
px a b c
1 8 aa 168
2 9 aa 153
3 7 aa 152
4 6 aa 120
1 7 bb 179
2 6 bb 169
3 5 bb 159
4 8 bb 149
5 9 bb 139

declare @tab table(a int,b varchar(2),c int)

insert @tab values(7,'aa',153)
insert @tab values(9,'aa',152)
insert @tab values(6,'aa',120)
insert @tab values(8,'aa',168)
insert @tab values(5,'bb',159)
insert @tab values(7,'bb',179)
insert @tab values(8,'bb',149)
insert @tab values(9,'bb',139)
insert @tab values(6,'bb',169)

select * from @tab

select px=(select count(1) from @tab where b=a.b and c>a.c)+1 , a,b,c from @tab a
order by b , c desc

px a b c
----------- ----------- ---- -----------
1 8 aa 168
2 7 aa 153
3 9 aa 152
4 6 aa 120
1 7 bb 179
2 6 bb 169
3 5 bb 159
4 8 bb 149
5 9 bb 139

(所影响的行数为 9 行)



--同时按两列分组
例如有一个表M 有A B C三列,其中值为
A B C
a1 b1 c1
a1 b1 c2
a1 b2 c1
a2 b2 c2
a2 b2 c3
a1 b2 c4
要求将其数据以A ,B列作为分组条件保存在别一个表N中,并区分不同组的明细资料(如加个区分列D)具体形式如下:
A B C D
a1 b1 c1 1
a1 b1 c2 1
a1 b2 c1 2
a2 b2 c2 3
a2 b2 c3 3
a1 b2 c4 2
帮忙想一下写法,想两天啦,还是搞不定,谢谢大家啦!


declare @M table(A varchar(4),B varchar(4),C varchar(4))
insert into @M select 'a1','b1','c1'
insert into @M select 'a1','b1','c2'
insert into @M select 'a1','b2','c1'
insert into @M select 'a2','b2','c2'
insert into @M select 'a2','b2','c3'
insert into @M select 'a1','b2','c4'

select t.*,(select count(distinct A+'|'+B) from @M where A<t.A or (A=t.A and B<=t.B)) as D from @M t

/*
A B C D
---- ---- ---- -----------
a1 b1 c1 1
a1 b1 c2 1
a1 b2 c1 2
a2 b2 c2 3
a2 b2 c3 3
a1 b2 c4 2
*/


create table m(A varchar(10),B varchar(10),C varchar(10))
insert into m values('a1', 'b1', 'c1')
insert into m values('a1', 'b1', 'c2')
insert into m values('a1', 'b2', 'c1')
insert into m values('a2', 'b2', 'c2')
insert into m values('a2', 'b2', 'c3')
insert into m values('a1', 'b2', 'c4')
go
select d = identity(int,1,1) , * into temp from (select distinct a,b from m) t
select m.*,temp.d from m,temp where m.a = temp.a and m.b = temp.b
drop table m,temp
/*
A B C d
---------- ---------- ---------- -----------
a1 b1 c1 1
a1 b1 c2 1
a1 b2 c1 2
a2 b2 c2 3
a2 b2 c3 3
a1 b2 c4 2

(所影响的行数为 6 行)

*/


--然后
select qid,cid,pid,ptid,pbid,ptName,pbName,pName,Model,
max(case px when 1 then comName else '' end) 'comName1',
max(case px when 1 then Price else 0 end) 'Price1',
max(case px when 2 then comName else '' end) 'comName2',
max(case px when 2 then Price else 0 end) 'Price2',
max(case px when 3 then comName else '' end) 'comName3',
max(case px when 3 then Price else 0 end) 'Price3'
from
(此处为上面的子查询) t
group by qid,cid,pid,ptid,pbid,ptName,pbName,pName,Model
fcuandy 2007-10-19
  • 打赏
  • 举报
回复
行转列..
LoveMosquito 2007-10-19
  • 打赏
  • 举报
回复
select px=(select count(1) from quote where pid=a.pid and QuotePrice<a.QuotePrice)+1 , qID,cid,pid,QuotePrice,QuoteTime,AddTime,AddPerson,ModPerson
from quote as a
order by pid,QuotePrice


px          qID         cid         pid         QuotePrice                                            
----------- ----------- ----------- ----------- -----------------------------------------------------
1 3 3 6 500.0
2 6 1 6 1000.0
3 7 2 6 8000.0
1 8 1 7 500.0
2 9 3 7 1000.0
2 4 2 7 1000.0
1 10 1 8 1000.0
2 5 3 8 1500.0
3 11 2 8 5000.0

(所影响的行数为 9 行)


第一步出来了,请问后面的代码是怎么回事啊。

--然后
select qid,cid,pid,ptid,pbid,ptName,pbName,pName,Model,
max(case px when 1 then comName else '' end) 'comName1',
max(case px when 1 then Price else 0 end) 'Price1',
max(case px when 2 then comName else '' end) 'comName2',
max(case px when 2 then Price else 0 end) 'Price2',
max(case px when 3 then comName else '' end) 'comName3',
max(case px when 3 then Price else 0 end) 'Price3'
from
(此处为上面的子查询) t
group by qid,cid,pid,ptid,pbid,ptName,pbName,pName,Model


这里(此处为上面的子查询) t是指哪一句的子查询呢?
LoveMosquito 2007-10-19
  • 打赏
  • 举报
回复
dawugui你好。你给的例子,我看了,不过还有些地方不明白。我也搜了一下相关类型的帖子,好多对我有帮助的基本上都是你回复的。

问题一:
select px=(select count(1) from @tab where b=a.b and c<a.c)+1 , a,b,c from @tab a
order by b , c

中的px是字段么?如果是字段,那么我是不是需要创建一张临时表。这张临时表,我是在原表上增加一个px的字段,还是将原表数据格式化成我要的数据在加上px这个字段呢?

问题二:
你给的例子中表名都是变量,我不知道代码中变量名代表的那个表。=。=

问题三:
max(case px when 1 then comName else '' end) 'comName1',
max(case px when 1 then Price else 0 end) 'Price1',

这2句也不大明白它的意思。

sql是我的弱项,所以问题比较白痴=。=

这种行转列的情况,思路就是,把数据格式化后写入到临时表,用完了在删除它,是吗?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧