SQL Server 2008 R2——ROW_NUMBER() 去掉不同行中相同列的重復內容


==================================聲明==================================

本文原創,轉載在正文中顯要的注明作者和出處,並保證文章的完整性。

未經作者同意請勿修改(包括本聲明),保留法律追究的權利。

未經作者同意請勿用於學術性引用。

未經作者同意請勿用於商業出版、商業印刷、商業引用。

本文不定期修正完善,為保證內容正確,建議移步原文處閱讀。

本文鏈接:http://www.cnblogs.com/wlsandwho/p/4416222.html

=======================================================================

總是寫一些“戰5渣”的東西,這次來個“戰6渣”的。不然沒法混了。

=======================================================================

 舉個例子,不一定好。

原創例子,必然沒有雷同。

這個栗子果然壞了。

=======================================================================

弄成這個樣子

=======================================================================

 1 USE tempdb
 2 GO
 3 --------------------------------------------------------------------------
 4 IF OBJECT_ID('Student','U') IS NOT NULL
 5 DROP TABLE Student
 6 GO
 7 
 8 CREATE TABLE Student
 9 (
10     StuID NVARCHAR(8) PRIMARY KEY,
11     Name NVARCHAR(5) 
12 )
13 GO
14 
15 INSERT INTO Student(StuID,Name) VALUES('20080001','Lily')
16 INSERT INTO Student(StuID,Name) VALUES('20080002','Lucy')
17 INSERT INTO Student(StuID,Name) VALUES('20080003','Jack')
18 GO
19 --------------------------------------------------------------------------
20 IF OBJECT_ID('SltCourse','U') IS NOT NULL
21 DROP TABLE SltCourse
22 GO
23 
24 CREATE TABLE SltCourse    --SelectiveCourse
25 (
26     ID INT PRIMARY KEY IDENTITY(1,1),
27     StuID NVARCHAR(8),
28     CourseName NVARCHAR(10),
29     Score    INT 
30 )
31 GO
32 
33 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080003','電腦維修',90)
34 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080003','剪紙',80)
35 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080003','市場策划',95)
36 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080003','信息檢索',100)
37 
38 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','插花',99)
39 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','剪紙',96)
40 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','刺綉',92)
41 
42 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080002','插花',98)
43 GO
44 --------------------------------------------------------------------------
45 SELECT * FROM Student
46 GO
47 SELECT * FROM SltCourse
48 GO
49 --------------------------------------------------------------------------
50 SELECT * FROM Student s,SltCourse sc WHERE s.stuid=sc.stuid
51 GO
52 --------------------------------------------------------------------------
53 WITH ReportCard 
54 AS(
55 SELECT s.StuID,s.Name,sc.CourseName,sc.Score FROM Student s,SltCourse sc WHERE s.stuid=sc.stuid
56 )
57 SELECT  CASE WHEN RowNum=1 THEN StuID   ELSE '' END AS ID,
58         CASE WHEN RowNum=1 THEN Name    ELSE '' END AS Name,
59         CourseName,
60         Score
61 FROM (SELECT *,ROW_NUMBER()  OVER (PARTITION BY StuID,Name ORDER BY Score) AS RowNum FROM ReportCard) TBL
62 GO
63 --------------------------------------------------------------------------
64 DROP TABLE Student
65 GO
66 DROP TABLE SltCourse
67 GO

=======================================================================

=======================================================================

然而……(然而……)×N

假如說,有一個字段是DateTime類型,那么可能會出現類似“1900-01-01 00:00:00.000”的東西。

例如下面略微修改過的代碼,添加了入學時間(EntranceTime):

 1 USE tempdb
 2 GO
 3 --------------------------------------------------------------------------
 4 IF OBJECT_ID('Student','U') IS NOT NULL
 5 DROP TABLE Student
 6 GO
 7 
 8 CREATE TABLE Student
 9 (
10     StuID NVARCHAR(8) PRIMARY KEY,
11     Name NVARCHAR(5),
12     EntranceTime DATETIME
13 )
14 GO
15 
16 INSERT INTO Student(StuID,Name,EntranceTime) VALUES('20080001','Lily','2008-08-27')
17 INSERT INTO Student(StuID,Name,EntranceTime) VALUES('20090002','Lucy','2009-08-26')
18 INSERT INTO Student(StuID,Name,EntranceTime) VALUES('20070003','Jack','2007-08-28')
19 GO
20 --------------------------------------------------------------------------
21 IF OBJECT_ID('SltCourse','U') IS NOT NULL
22 DROP TABLE SltCourse
23 GO
24 
25 CREATE TABLE SltCourse    --SelectiveCourse
26 (
27     ID INT PRIMARY KEY IDENTITY(1,1),
28     StuID NVARCHAR(8),
29     CourseName NVARCHAR(10),
30     Score    INT 
31 )
32 GO
33 
34 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20070003','電腦維修',90)
35 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20070003','剪紙',80)
36 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20070003','市場策划',95)
37 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20070003','信息檢索',100)
38 
39 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','插花',99)
40 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','剪紙',96)
41 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20080001','刺綉',92)
42 
43 INSERT INTO SltCourse(StuID,CourseName,Score) VALUES('20090002','插花',98)
44 GO
45 --------------------------------------------------------------------------
46 SELECT * FROM Student
47 GO
48 SELECT * FROM SltCourse
49 GO
50 --------------------------------------------------------------------------
51 SELECT * FROM Student s,SltCourse sc WHERE s.stuid=sc.stuid
52 GO
53 --------------------------------------------------------------------------
54 WITH ReportCard 
55 AS(
56 SELECT s.StuID,s.Name,s.EntranceTime,sc.CourseName,sc.Score FROM Student s,SltCourse sc WHERE s.stuid=sc.stuid
57 )
58 SELECT  CASE WHEN RowNum=1 THEN StuID          ELSE '' END AS ID,
59         CASE WHEN RowNum=1 THEN Name            ELSE '' END AS Name,
60         CASE WHEN RowNum=1 THEN EntranceTime    ELSE '' END AS EntranceTime,
61         CourseName,
62         Score
63 FROM (SELECT *,ROW_NUMBER()  OVER (PARTITION BY StuID,Name,EntranceTime ORDER BY Score) AS RowNum FROM ReportCard) TBL
64 GO
65 --------------------------------------------------------------------------
66 DROP TABLE Student
67 GO
68 DROP TABLE SltCourse
69 GO

最終顯示為:

這肯定不行啊。

讓我先想想。

=======================================================================

改成

WITH ReportCard 
AS(
SELECT s.StuID,s.Name,s.EntranceTime,sc.CourseName,sc.Score FROM Student s,SltCourse sc WHERE s.stuid=sc.stuid
)
SELECT  CASE WHEN RowNum=1 THEN StuID          ELSE '' END AS ID,
        CASE WHEN RowNum=1 THEN Name            ELSE '' END AS Name,
        CASE WHEN RowNum=1 THEN EntranceTime    ELSE cast(nullif('','') as datetime) END AS EntranceTime,
        CourseName,
        Score
FROM (SELECT *,ROW_NUMBER()  OVER (PARTITION BY StuID,Name,EntranceTime ORDER BY Score) AS RowNum FROM ReportCard) TBL
GO

則效果為

=======================================================================

但是怎么才能把變成呢?

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM