~~~求救sql2005行列转换问题~~~~~~~~~~~

hanyise520 2011-12-23 10:31:24
电话号码 区域 开通类型 AP值 金融次数 教育次数 医疗次数 通信次数 旅游次数 文化次数 工业次数 广告次数13002300001 江北 生活 205.61 10
13002300001 江北 新闻 205.61 10
13002300001 南岸 惠动山城 205.61 10

怎么转换为 :
电话号码 区域 生活 新闻 惠动山城 AP值 金融次数 教育次数 医疗次数 通信次数 旅游次数 文化次数 工业次数13002300001 江北 1 1 1 205.61 10


主要是“开通类型”这列要转换,如果“电话号码”相同(就是3种“类型”都开通的号码)转换后标1。 相同号码“开通类型”后面的数据都一样,就保留一条就够了,如“旅游次数”都是10次,转换后就是“10”,“AP值”是205.61。
...全文
106 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
SQL codeselect 电话号码 , max(区域) 区域,
max(case when 开通类型 = '生活' then 1 else 0 end) 生活,
max(case when 开通类型 = '新闻' then 1 else 0 end) 新闻,
max(case when 开通类型 = '惠动山城' then 1 else 0 end) 惠动山城,
AP值 ,金融次数 ,教育次数 ,医疗次数 ,通信次数 ,旅游次数 ,文化次数 ,工业次数
group by 电话号码 , AP值 ,金融次数 ,教育次数 ,医疗次数 ,通信次数 ,旅游次数 ,文化次数 ,工业次数

/***************************************************************************/
不行,没有聚合成功,数据条数没减少,查询结果只有“生活”且全部都是1了
dawugui 2011-12-23
  • 打赏
  • 举报
回复
select 电话号码 , max(区域) 区域,
max(case when 开通类型 = '生活' then 1 else 0 end) 生活,
max(case when 开通类型 = '新闻' then 1 else 0 end) 新闻,
max(case when 开通类型 = '惠动山城' then 1 else 0 end) 惠动山城,
AP值 ,金融次数 ,教育次数 ,医疗次数 ,通信次数 ,旅游次数 ,文化次数 ,工业次数
group by 电话号码 , AP值 ,金融次数 ,教育次数 ,医疗次数 ,通信次数 ,旅游次数 ,文化次数 ,工业次数
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
电话号码 区域 开通类型 AP值 金融次数 教育次数 医疗次数 通信次数 旅游次数 文化次数 工业次数13002300001 江北 生活 205.61
13002300001 江北 新闻 205.61
13002300001 江北 惠动山城 205.61
18655555555 南岸 生活 300
18655555555 南岸 新闻 300


怎么转换为 :
电话号码 区域 生活 新闻 惠动山城 AP值 金融次数 教育次数 医疗次数 通信次数 旅游次数 文化次数 13002300001 江北 1 1 1 205.61
18655555555 南岸 1 1 0 300
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
电话号码 区域 开通类型 AP值 金融次数 教育次数 医疗次数 通信次数 旅游次数 文化次数 工业次数 13002300001 江北 生活 205.61
13002300001 江北 新闻 205.61
13002300001 江北 惠动山城 205.61
18620200000 南岸 生活 300
18620200000 南岸 新闻 300

怎么转换为 :
电话号码 区域 生活 新闻 惠动山城 AP值 金融次数 教育次数 医疗次数 通信次数 旅游次数 文化次数13002300001 江北 1 1 1 205.61 10
18620200000 南岸 1 1 0 300
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
--假设开通类型只有生活,新闻,惠动山城这三种,且相同电话号码不存在重复的话,可如下:

select t.* , 生活 = 1 , 新闻 = 1 , 惠动山城 = 1 from tb t
where 区域 = (select max(区域) from tb where 电话号码 = t.电话号码)
and 电话号码 in (select 电话号码 from tb group by 电话号码 having count(1) = 3)
/******************************************************************************/
其实不一定每个号码都对应了 3种类型,有可能一个号码只开通了“生活”,有可能开通了2种“生活”“新闻”,最多一个号码开通3种“生活”“新闻”“惠动山城”
pengxuan 2011-12-23
  • 打赏
  • 举报
回复
没看懂这结构
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
运行出来没有数据!运行出来没有数据!运行出来没有数据!
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
运行 提示 :

消息 147,级别 15,状态 1,第 1 行
聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。
dawugui 2011-12-23
  • 打赏
  • 举报
回复
--假设开通类型只有生活,新闻,惠动山城这三种,且相同电话号码不存在重复的话,可如下:

select t.* , 生活 = 1 , 新闻 = 1 , 惠动山城 = 1 from tb t
where 区域 = (select max(区域) from tb where 电话号码 = t.电话号码)
and 电话号码 in (select 电话号码 from tb group by 电话号码 having count(1) = 3)
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
CSDN 发帖的时候,可能格式有点错位。 相同号码最多只有3个,就是3种“开通类型”都有
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
02300001

13002300001
是一个值?

能否告诉这类的数据的规律?

/*********************************************/
哦,格式问题,其实是一个值,相同号码,表里面有100W数据,相同号码很多
dawugui 2011-12-23
  • 打赏
  • 举报
回复
02300001

13002300001
是一个值?

能否告诉这类的数据的规律?
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
明白了,谢谢
美到心痛 2011-12-23
  • 打赏
  • 举报
回复
max是因為用group by,非group by 字段要用聚合函數,max在這里是個無意思卻又不得不要的函數.
case then是用來進行分類了,用來區分'开通类型'
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
最后想问问,max,case then 在这里的含义,以后好举一反三
hanyise520 2011-12-23
  • 打赏
  • 举报
回复
OK 搞定了,结果是表数据不全,谢谢 dawugui(爱新觉罗.毓华)

34,590

社区成员

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

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