Sorting/Splitting 一行中的一列分成不同的视图列
Sorting/Splitting a column into different view columns in one row
我在创建视图时遇到问题,该视图应将 table 的一列拆分为一行中的三个不同列。
数据 table 看起来类似于:
我想要做的是为每个类型(类型的数量固定为三个)创建一个视图,其中三个 ID/序列号。相同大小的不同颜色(颜色数量也固定为三种)排成一排,像这样:
附加数据(如重量等)位于此之后。
到目前为止我得到的是:
CREATE VIEW [dbo].[Typ1]
AS SELECT
Size AS Size,
CASE WHEN Color = 'Blue' THEN SerialNo END AS SerialNoBlue ,
CASE WHEN Color = 'Grey' THEN SerialNo END AS SerialNoGrey,
CASE WHEN Color = 'Green' THEN SerialNo END AS SerialNo Green
FROM [Table]
WHERE Typ = 'Typ1'
结果是这样的:
我的问题是是否有办法 "merge" X 列相同的行?
或者有完全不同的方法吗?
您需要一个条件聚合
CREATE VIEW [dbo].[Typ1]
AS SELECT Size AS Size,
max(CASE WHEN Color = 'Blue' THEN SerialNo END) AS SerialNoBlue ,
max(CASE WHEN Color = 'Grey' THEN SerialNo END) AS SerialNoGrey,
max(CASE WHEN Color = 'Green' THEN SerialNo END) AS SerialNo Green
FROM [Table]
WHERE Typ = 'Typ1' group by Size
另一种方法是先按大小分组,然后用蓝色、灰色和绿色进行 3 个内部连接,如下所示:-
首先我会用内存table模拟你的数据如下(你不需要这个)
Declare @t Table (
ID int,
Size int,
SerialNo int,
Color varchar(20),
[Weight] int,
Typ varchar(20)
)
insert into @t values
(1,130,96043,'Blue',120,'Typ1'),
(2,130,96041,'Grey',120,'Typ1'),
(3,130,96055,'Green',120,'Typ1'),
(4,170,96096,'Blue' ,220,'Typ2'),
(5,170,96050,'Grey' ,220,'Typ2'),
(6,170,96040,'Green',220,'Typ2'),
(7,190,96042,'Blue' ,300,'Typ1'),
(8,190,96045,'Grey' ,300,'Typ1'),
(9,190,96070,'Green',300,'Typ1'),
(10,220,96080,'Blue' ,360,'Typ3'),
(11,220,96095,'Grey' ,360,'Typ3'),
(12,220,96093,'Green',360,'Typ3')
然后查询得到想要的结果(可以转换成视图)
;with cte as (
Select t.Size from @t t group by t.Size
)
select cte.Size
,b.SerialNo [Serial no. Blue],b.ID [ID Blue]
,g.SerialNo [Serial no. Grey],g.ID [ID Grey]
,r.SerialNo [Serial no. Green],r.ID [ID Green]
,b.[Weight]
from cte
inner join @t b on b.Size=cte.Size and b.Color='Blue'
inner join @t g on g.Size=cte.Size and g.Color='Grey'
inner join @t r on r.Size=cte.Size and r.Color='Green'
输出将是:-
Size S.B ID.Blue S.Gr ID.Grey S.G ID.Green Weight
130 96043 1 96041 2 96055 3 120
190 96042 7 96045 8 96070 9 300
我在创建视图时遇到问题,该视图应将 table 的一列拆分为一行中的三个不同列。
数据 table 看起来类似于:
我想要做的是为每个类型(类型的数量固定为三个)创建一个视图,其中三个 ID/序列号。相同大小的不同颜色(颜色数量也固定为三种)排成一排,像这样:
附加数据(如重量等)位于此之后。
到目前为止我得到的是:
CREATE VIEW [dbo].[Typ1]
AS SELECT
Size AS Size,
CASE WHEN Color = 'Blue' THEN SerialNo END AS SerialNoBlue ,
CASE WHEN Color = 'Grey' THEN SerialNo END AS SerialNoGrey,
CASE WHEN Color = 'Green' THEN SerialNo END AS SerialNo Green
FROM [Table]
WHERE Typ = 'Typ1'
结果是这样的:
我的问题是是否有办法 "merge" X 列相同的行?
或者有完全不同的方法吗?
您需要一个条件聚合
CREATE VIEW [dbo].[Typ1]
AS SELECT Size AS Size,
max(CASE WHEN Color = 'Blue' THEN SerialNo END) AS SerialNoBlue ,
max(CASE WHEN Color = 'Grey' THEN SerialNo END) AS SerialNoGrey,
max(CASE WHEN Color = 'Green' THEN SerialNo END) AS SerialNo Green
FROM [Table]
WHERE Typ = 'Typ1' group by Size
另一种方法是先按大小分组,然后用蓝色、灰色和绿色进行 3 个内部连接,如下所示:-
首先我会用内存table模拟你的数据如下(你不需要这个)
Declare @t Table (
ID int,
Size int,
SerialNo int,
Color varchar(20),
[Weight] int,
Typ varchar(20)
)
insert into @t values
(1,130,96043,'Blue',120,'Typ1'),
(2,130,96041,'Grey',120,'Typ1'),
(3,130,96055,'Green',120,'Typ1'),
(4,170,96096,'Blue' ,220,'Typ2'),
(5,170,96050,'Grey' ,220,'Typ2'),
(6,170,96040,'Green',220,'Typ2'),
(7,190,96042,'Blue' ,300,'Typ1'),
(8,190,96045,'Grey' ,300,'Typ1'),
(9,190,96070,'Green',300,'Typ1'),
(10,220,96080,'Blue' ,360,'Typ3'),
(11,220,96095,'Grey' ,360,'Typ3'),
(12,220,96093,'Green',360,'Typ3')
然后查询得到想要的结果(可以转换成视图)
;with cte as (
Select t.Size from @t t group by t.Size
)
select cte.Size
,b.SerialNo [Serial no. Blue],b.ID [ID Blue]
,g.SerialNo [Serial no. Grey],g.ID [ID Grey]
,r.SerialNo [Serial no. Green],r.ID [ID Green]
,b.[Weight]
from cte
inner join @t b on b.Size=cte.Size and b.Color='Blue'
inner join @t g on g.Size=cte.Size and g.Color='Grey'
inner join @t r on r.Size=cte.Size and r.Color='Green'
输出将是:-
Size S.B ID.Blue S.Gr ID.Grey S.G ID.Green Weight
130 96043 1 96041 2 96055 3 120
190 96042 7 96045 8 96070 9 300