这个交叉表怎么写?

Dision LI 2011-07-28 05:18:30
数据类似如下:
名称 颜色 客户 价格
产品A 黄色 客户1 0.1
产品A 红色 客户2 0.1
产品A 绿色 客户2 0.2
产品A 绿色 客户2 0.3
产品B 黄色 客户3 0.2
产品B 绿色 客户2 0.2

==>>

名称 黄色 红色 绿色
客户1 客户3 客户2 客户2
产品A 0.1 0 0.1 0.2
产品B 0 0.2 0 0.2



按颜色+客户交叉,先按颜色排,再分颜色下有几个客户
然后取最小价格

SQL能实现?
...全文
78 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mr_cheung 2011-07-28
  • 打赏
  • 举报
回复
create table tb(name varchar(5),color varchar(5),cust varchar(5), jiage float)
insert into tb
select '产品A','黄色','客户1',0.1 union
select '产品A','红色','客户2',0.1 union
select '产品A','绿色','客户2',0.2 union
select '产品A','绿色','客户2',0.3 union
select '产品B','黄色','客户3',0.2 union
select '产品B','绿色','客户2',0.2


declare @sql varchar(8000)
set @sql = 'select name '
select @sql = @sql + ' , min(case when color=''' + color+''' and cust='''+
cust + ''' then jiage else null end) [' + color+cust + ']'
from tb group by color,cust
set @sql = @sql + ' from tb group by name'
exec(@sql)
mr_cheung 2011-07-28
  • 打赏
  • 举报
回复
create table tb(name varchar(5),color varchar(5),cust varchar(5), jiage float)
insert into tb
select '产品A','黄色','客户1',0.1 union
select '产品A','红色','客户2',0.1 union
select '产品A','绿色','客户2',0.2 union
select '产品A','绿色','客户2',0.3 union
select '产品B','黄色','客户3',0.2 union
select '产品B','绿色','客户2',0.2


declare @sql varchar(8000)
set @sql = 'select name '
select @sql = @sql + ' , min(case when color=''' + color+''' and cust='''+
cust + ''' then jiage else null end) [' + color+cust + ']'
from tb group by color,cust
set @sql = @sql + ' from tb group by name'
exec(@sql)



name 红色客户2 黄色客户1 黄色客户3 绿色客户2
----- ----------------------------------------------------- ----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
产品A 0.10000000000000001 0.10000000000000001 NULL 0.20000000000000001
产品B NULL NULL 0.20000000000000001 0.20000000000000001

警告: 聚合或其它 SET 操作消除了空值。
cd731107 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hongnacarla 的回复:]
不行吧,你这样的结果都不是表的形式啊!要保证列不能划分
[/Quote]
是的,具体的样式必须要用程序来控制,sql主要负责输出数据
Dision LI 2011-07-28
  • 打赏
  • 举报
回复
看来要在程序中处理了,谢谢各位
qq598235031 2011-07-28
  • 打赏
  • 举报
回复
主要业务是什么,如何建好表后,查下数据库就得到了
AcHerat 元老 2011-07-28
  • 打赏
  • 举报
回复

create table tb(name varchar(5),color varchar(5),cust varchar(5), jiage float)
insert into tb
select '产品A','黄色','客户1',0.1 union
select '产品A','红色','客户2',0.1 union
select '产品A','绿色','客户2',0.2 union
select '产品A','绿色','客户2',0.3 union
select '产品B','黄色','客户3',0.2 union
select '产品B','绿色','客户2',0.2
go

declare @sql varchar(8000)
set @sql = 'select name '
select @sql = @sql + ',min(case when color=''' + color+''' and cust='''+ cust
+ ''' then jiage else null end) [' + color+cust + ']'
from (select distinct color,cust from tb)t
order by color,cust
set @sql = @sql + ' from tb group by name'
exec(@sql)

drop table tb

/***************

name 红色客户2 黄色客户1 黄色客户3 绿色客户2
----- ---------------------- ---------------------- ---------------------- ----------------------
产品A 0.1 0.1 NULL 0.2
产品B NULL NULL 0.2 0.2
警告: 聚合或其他 SET 操作消除了空值。

(2 行受影响)


那个NULL不能换其他数值!
hongnacarla 2011-07-28
  • 打赏
  • 举报
回复
不行吧,你这样的结果都不是表的形式啊!要保证列不能划分
叶子 2011-07-28
  • 打赏
  • 举报
回复

declare @t table
(名称 varchar(5),颜色 varchar(4),客户 varchar(5),价格 numeric(2,1))
insert into @t
select '产品A','黄色','客户1',0.1 union all
select '产品A','红色','客户2',0.1 union all
select '产品A','绿色','客户2',0.2 union all
select '产品A','绿色','客户2',0.3 union all
select '产品B','黄色','客户3',0.2 union all
select '产品B','绿色','客户2',0.2
;with maco as(
select 名称,颜色,客户,价格=min(价格) from @t
group by 名称,颜色,客户
)

select 名称,
left(max(case when 颜色='黄色' then 客户+'('+ltrim(价格)+')' end),10) as '黄色',
left(max(case when 颜色='红色' then 客户+'('+ltrim(价格)+')' end),10) as '红色',
left(max(case when 颜色='绿色' then 客户+'('+ltrim(价格)+')' end),10) as '绿色'
from maco group by 名称
/*
名称 黄色 红色 绿色
----- -------------------- -------------------- --------------------
产品A 客户1(0.1) 客户2(0.1) 客户2(0.2)
产品B 客户3(0.2) NULL 客户2(0.2)
*/

--我暂时只能弄成这种样子...
--这个貌似应该在程序中处理
快溜 2011-07-28
  • 打赏
  • 举报
回复
create table tb(name varchar(5),color varchar(5),cust varchar(5), jiage float)
insert into tb
select '产品A','黄色','客户1',0.1 union
select '产品A','红色','客户2',0.1 union
select '产品A','绿色','客户2',0.2 union
select '产品A','绿色','客户2',0.3 union
select '产品B','黄色','客户3',0.2 union
select '产品B','绿色','客户2',0.2


declare @sql varchar(8000)
set @sql = 'select name '
select @sql = @sql + ' , min(case when color=''' + color+''' and cust='''+
cust + ''' then jiage else null end) [' + color+cust + ']'
from tb group by color,cust
set @sql = @sql + ' from tb group by name'
exec(@sql)

/*
name 红色客户2 黄色客户1 黄色客户3 绿色客户2
----- ---------------------- ---------------------- ---------------------- ----------------------
产品A 0.1 0.1 NULL 0.2
产品B NULL NULL 0.2 0.2
警告: 聚合或其他 SET 操作消除了 Null 值。

(2 行受影响)

34,594

社区成员

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

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