j****s 发帖数: 881 | 1 有一个表 (第一行为column name):
CM CN CA CB CC CD
M1 N1 A C
M2 N2
M3 N3 B D
M4 N4 A
...
要变成这种形式:
CM CN CL
M1 N1 A
M1 N1 C
M3 N3 B
M3 N3 D
M4 N4 A
...
就是说把CA CB CC CD这些列里有值的都放到CL列,如果CA CB CC CD都为空,那一行就
不要了,如果同一行里CA CB CC CD有n不为空的值,就重复该行n次。
有什么简便方法吗?
多谢各位大佬! | B*****g 发帖数: 34098 | 2 SELECT CM, CN, CA AS CL
FROM 表
WHERE CA IS NOT NULL
UNION ALL
SELECT CM, CN, CB AS CL
FROM 表
WHERE CB IS NOT NULL
....
If there duplicate and you want to remove, use UNION instead of UNION ALL
【在 j****s 的大作中提到】 : 有一个表 (第一行为column name): : CM CN CA CB CC CD : M1 N1 A C : M2 N2 : M3 N3 B D : M4 N4 A : ... : 要变成这种形式: : CM CN CL : M1 N1 A
| i*****w 发帖数: 75 | 3 This is a Pivot/UnPivot problem:
Declare @tbl Table (CM Varchar(10), CN Varchar(10), CA Varchar(10), CB
Varchar(10), CC Varchar(10) , CD Varchar(10))
INSERT INTO @tbl(CM, CN, CA, CC)
VALUES('M1','N1','A','C')
INSERT INTO @tbl(CM, CN)
VALUES('M2', 'N2')
INSERT INTO @tbl(cm, cn, cb, cd)
VALUES('M3', 'N3', 'B', 'D')
INSERT INTO @tbl(cm, cn, ca)
VALUES('M4','N4','A')
Select * FROM @tbl
SELECT CM, CN, Value as CL
FROM
(
Select CM, CN, CA, CB, CC, CD FROM @tbl
)p
UNPIVOT
(Value FOR CL IN (CA, CB, CC, CD))
as UnPvt | g***l 发帖数: 18555 | 4 PIVOT可以解决,老的办法是这样 TABLE
CM CN C
INSERT INTO TABLE SELECT CM CN CA WHERE CA IS NOT NULL
INSERT INTO TABLE SELECT CM CN CB WHERE CB IS NOT NULL
INSERT INTO TABLE SELECT CM CN CC WHERE CC IS NOT NULL
INSERT INTO TABLE SELECT CM CN CD WHERE CD IS NOT NULL | j****s 发帖数: 881 | 5 多谢多谢,gejkl 和beijing的解法看着比较简单。
我能想到的是用cursor一行行读,但是比较麻烦。
以上各位各领一个包子以表感谢。 | j****s 发帖数: 881 | 6 表1
CM CN CL
M1 N1 A
M1 N1 C
M3 N3 B
M3 N3 D
M4 N4 A
。。。
变表2
CM CN CA CB CC CD
M1 N1 A C
M3 N3 B D
M4 N4 A
。。。
是不是就只能用cursor了?还有什么简便方法吗? | i*****w 发帖数: 75 | 7 Still the Pivot function.
Declare @tbl Table (CM Varchar(10), CN Varchar(10), CL Varchar(10))
INSERT INTO @tbl(CM, CN, CL)
VALUES('M1','N1','A')
INSERT INTO @tbl(CM, CN, CL)
VALUES('M1','N1','C')
INSERT INTO @tbl(CM, CN, CL)
VALUES('M3', 'N3', 'B')
INSERT INTO @tbl(CM, CN, CL)
VALUES('M3', 'N3', 'D')
INSERT INTO @tbl(CM, CN, CL)
VALUES('M4','N4','A')
Select * FROM @tbl
SELECT CM, CN, A as CA, B as CB, C as CC, D as CD
FROM
(
select CM, CN, CL from @tbl
)p
PIVOT
(MAX(CL) for CL IN (A,B,C,D))
as Pvt
【在 j****s 的大作中提到】 : 表1 : CM CN CL : M1 N1 A : M1 N1 C : M3 N3 B : M3 N3 D : M4 N4 A : 。。。 : 变表2 : CM CN CA CB CC CD
| j****s 发帖数: 881 | 8 这个pivot function我用的不多,看来要熟悉一下,很有用。
双黄包一个。 |
|