解决行转列,列分行,行合并列的疑难问题

本文以SQL Server 2000为例:

SQL code/*=============
===fcuandy=====
===2008.1.10===
=============*/

CREATE TABLE ta(id INT IDENTITY(1,1),cid INT,name VARCHAR(10))
GO
INSERT ta SELECT 1,"a"
UNION ALL SELECT 1,"b"
UNION ALL SELECT 1,"c"
UNION ALL SELECT 2,"d"
UNION ALL SELECT 3,"e"
UNION ALL SELECT 3,"f"
GO

/* 

数据挖掘研究院

示例1

同一分类中取1条或n条。
单表及多表的写法
*/

-----------------------------------------------------------
--以ta为例,cid为分类id,每个id取一条,我以取最小id为约束条件
SELECT a.* FROM ta a
    WHERE NOT EXISTS(SELECT 1 FROM ta WHERE cid=a.cid AND id<a.id)
SELECT a.* FROM ta a
    WHERE 1>(SELECT COUNT(*) FROM ta WHERE cid=a.cid AND id<a.id)

SELECT a.* FROM ta a
    WHERE id IN (SELECT TOP 1 ID FROM ta WHERE cid=a.cid ORDER BY id)
SELECT a.* FROM ta a
    WHERE id = (SELECT TOP 1 ID FROM ta WHERE cid=a.cid ORDER BY id)
SELECT a.* FROM ta a
    WHERE id IN (SELECT MIN(ID) FROM ta WHERE cid=a.cid)
SELECT a.* FROM ta a
    WHERE id = (SELECT MIN(ID) FROM ta WHERE cid=a.cid)
SELECT a.* 
    FROM ta a
INNER JOIN 
    (SELECT MIN(id) mi FROM ta GROUP BY cid) b
    ON id = mi
--etc.其它的组合写法再不累赘

--以cid为分类,每个cid取id最小的2条记录,2可以适当修改
SELECT a.* FROM ta a
    WHERE 2>(SELECT COUNT(*) FROM ta WHERE cid=a.cid AND id<a.id)
SELECt a.* FROM ta a
    WHERE id IN (SELECT TOP 2 ID FROM ta WHERE cid=a.cid ORDER BY ID)
SELECT a.*
    FROM ta a
INNER JOIN
(SELECT ID,CNT=(SELECT COUNT(*) FROM ta 
WHERE cid=x.cid AND id<x.id) FROM ta x) b
    ON a.id = b.id AND cnt<2
--etc.其它的组合写法省略  

以上是针对ta单表。 如果多表,下面以二表为例

CREATE TABLE tb(cid INT,className VARCHAR(10))
GO
INSERT tb SELECT 1,"A"
UNION ALL SELECT 2,"B"
UNION ALL SELECT 3,"C"
GO
--ta,tb以cid关联,取每个cid中id最小的一条记录,
需要 tb.className,tb.cid,ta.id,ta.name列。
SELECT b.*,a.* 
    FROM tb b
INNER JOIN ta a
    ON a.cid = b.cid
    WHERE NOT EXISTS(SELECT 1 FROM ta WHERE cid=a.cid AND id<a.id)
GO
--多表与单表取数思路一对致,多一次连表操作,
可以照上面单表的把其它写法改出来.
--同样,取每个cid中id最小的前n条记录,一样的方法
--需要注意的是连表时,可以用内连,左连,或是老式的
多表写法(from ta ,tb where ta.cid=tb.cid默认转换为内连),
采用哪种方式依具你的业务需求。



--------------------------------------------
/*  

1 2 下一页>> 数据挖掘研究院

数据挖掘工具

Create By Any-Extract(WL-AE)

[数据挖掘专家] [数据挖掘研究院] [数据挖掘论坛] [数据挖掘实验室]
上一篇:深入了解SQL Server数据库的线程与纤程
下一篇:讲解SQL Server 2005同步复制技术的应用
最新评论共有 0 位网友发表了评论 , 查看所有评论
发表评论( 不能超过250字,需审核,请自觉遵守互联网相关政策法规。 )
匿名?
数据挖掘网站导航 数据挖掘论坛导航
  • 数据挖掘工具
  • 数据挖掘论坛
  • DataCruncher - Cognos
  • MineSet - MathSoft
  • Intelligent Miner - GainSmarts
  • Sqlserver - SAS - Clementine
  • CART - Weka - WizSoft
  • NeuroShell - ModelQuest
  • data mining tools - Darwin
  • 数据挖掘交友
  • 数据挖掘博客
  • 数据挖掘工具
  • 数据挖掘资源
  • 数据挖掘技术算法
  • 数据挖掘相关期刊、会议
  • 研究院联盟合作专区
  • 数据挖掘基础与相关技术
  • 数据挖掘厂商与就业
  • 数据挖掘研究者乐园
  • 知名厂商数据挖掘工具资料
  • 国内数据挖掘实验室
  • Foreign Data Mining Lab
  • 热点关注
  • MS SQL "1813"错误产生的原因及解决
  • SQL Server 2005的30个最重要特点
  • SQL Server数据仓库相关概念及构建流程
  • SQL Server 2005 Integration Services - P
  • SQL Server 2005 Integration Services - P
  • SQL Server 2005 Integration Services - L
  • 使用 WebSphere Commerce Analyzer 以关联
  • SQL Server 2005 Integration Services - P
  • SQL Server 2005 Integration Services - P
  • SQL Server 2005 Integration Services - F
  • 论坛最新话题
  • Foundations of Statistical Natural Langu
  • Game Theory meet Data Mining: A Recent P
  • System Building: How does it help or hin
  • 数据挖掘与Clementine培训
  • 新手报到
  • 求 SASEM 客户流失预测分析
  • 数据挖掘工程师/搜索研究院—北京——无线
  • 数据挖掘入门介绍(如何着手数据挖掘)
  • Information Overload Survey Results
  • The INEX 2005 Workshop on Element Retrie
  • 相关资讯
  • SQL Server 2005的30个最重要特点
  • 深入了解SQL Server数据库的线程与纤程
  • 数据挖掘实验室资料
  • 数据挖掘博客地址
  • 数据挖掘实验室网站地址
  • Prepare for Medicare audits by using dat
  • 注册成为SAS用户与爱好者俱乐部会员
  • 水南梅
  • 明日烟
  • 新人报道
  • 下载
  • 厦门服务器托管,450元/月—0592-5177319 高
  • 买空间送域名--0592-5177319 高静