SQL实验四
如何实现这样的查询? 行变成列
有这样两个数据表
(WuZi_Table)
物资编码(id), 颜色编号(Color_id), 数量(acount)
1111 1 10
2222 2 20
1111 1 20
3333 3 5
1111 3 10
(YanSe_Table)
颜色编号(Color_id), 颜色名称(Color)
1 红色
2 兰色
3 绿色
...
颜色可能会增加
如何查询得到
物资编码 红色 兰色 绿色 ...
1111 30 0 10
2222 0 20 0
3333 0 0 5
存储过程如何写?
USE Master
Create DataBase myTest
GO
![]()
![]()
Use myTest
--(WuZi_Table)
--物资编码(id), 颜色编号(Color_id), 数量(acount)
--1111 1 10
--2222 2 20
--1111 1 20
--3333 3 5
--1111 3 10
Create Table [WuZi_Table]
(
id int,Color_id int,acount int
)
GO
![]()
--(YanSe_Table)
--颜色编号(Color_id), 颜色名称(Color)
--1 红色
--2 兰色
--3 绿色
Create Table [YanSe_Table]
(
Color_id int,Color varchar(10)
)
GO
![]()
INSERT INTO [myTest].[dbo].[WuZi_Table]
VALUES
(1111,1,10)
GO
INSERT INTO [myTest].[dbo].[WuZi_Table]
VALUES
(2222,2,20)
GO
INSERT INTO [myTest].[dbo].[WuZi_Table]
VALUES
(1111,1,20)
GO
INSERT INTO [myTest].[dbo].[WuZi_Table]
VALUES
(3333,3,5)
GO
INSERT INTO [myTest].[dbo].[WuZi_Table]
VALUES
(1111,3,10)
GO
![]()
![]()
INSERT INTO [myTest].[dbo].[YanSe_Table]
VALUES
(1,'红色')
GO
INSERT INTO [myTest].[dbo].[YanSe_Table]
VALUES
(2,'兰色')
GO
INSERT INTO [myTest].[dbo].[YanSe_Table]
VALUES
(3,'绿色')
GO
![]()
![]()
-- =============================================
-- Author: ajayumi
-- Create date: 2008-05-19
-- Description:
-- 制作如下效果:
-- 物资编码 红色 兰色 绿色 ![]()
-- 1111 30 0 10
-- 2222 0 20 0
-- 3333 0 0 5
-- =============================================
Create PROCEDURE ajProc
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
![]()
-- Insert statements for procedure here
CREATE TABLE [tb_Temp]([ID] INT,[Color] VARCHAR(10),[Count] INT)
INSERT INTO [tb_Temp]
SELECT [id],[color],[acount]
FROM [WuZi_Table] INNER JOIN [YanSe_Table]
ON [WuZi_Table].[Color_id] = [YanSe_Table].[Color_id]
![]()
DECLARE @s VARCHAR(2000)
SET @s='SELECT ID 物资编码'
SELECT @s = @s+',['+Color+']=SUM(CASE [Color] WHEN '''+Color+''' THEN [Count] ELSE 0 END)'
FROM [tb_Temp] GROUP BY [Color]
EXEC(@s+'from [tb_Temp] group by ID')
![]()
drop table [tb_Temp]
![]()
END
GO
![]()
EXEC ajProc
GO
有这样两个数据表
(WuZi_Table)
物资编码(id), 颜色编号(Color_id), 数量(acount)
1111 1 10
2222 2 20
1111 1 20
3333 3 5
1111 3 10
(YanSe_Table)
颜色编号(Color_id), 颜色名称(Color)
1 红色
2 兰色
3 绿色
...
颜色可能会增加
如何查询得到
物资编码 红色 兰色 绿色 ...
1111 30 0 10
2222 0 20 0
3333 0 0 5
存储过程如何写?
USE Master
Create DataBase myTest
GO

Use myTest
--(WuZi_Table)
--物资编码(id), 颜色编号(Color_id), 数量(acount)
--1111 1 10
--2222 2 20
--1111 1 20
--3333 3 5
--1111 3 10
Create Table [WuZi_Table]
(
id int,Color_id int,acount int
)
GO
--(YanSe_Table)
--颜色编号(Color_id), 颜色名称(Color)
--1 红色
--2 兰色
--3 绿色
Create Table [YanSe_Table]
(
Color_id int,Color varchar(10)
)
GO
INSERT INTO [myTest].[dbo].[WuZi_Table]
VALUES
(1111,1,10)
GO
INSERT INTO [myTest].[dbo].[WuZi_Table]
VALUES
(2222,2,20)
GO
INSERT INTO [myTest].[dbo].[WuZi_Table]
VALUES
(1111,1,20)
GO
INSERT INTO [myTest].[dbo].[WuZi_Table]
VALUES
(3333,3,5)
GO
INSERT INTO [myTest].[dbo].[WuZi_Table]
VALUES
(1111,3,10)
GO

INSERT INTO [myTest].[dbo].[YanSe_Table]
VALUES
(1,'红色')
GO
INSERT INTO [myTest].[dbo].[YanSe_Table]
VALUES
(2,'兰色')
GO
INSERT INTO [myTest].[dbo].[YanSe_Table]
VALUES
(3,'绿色')
GO

-- =============================================
-- Author: ajayumi
-- Create date: 2008-05-19
-- Description:
-- 制作如下效果:
-- 物资编码 红色 兰色 绿色 
-- 1111 30 0 10
-- 2222 0 20 0
-- 3333 0 0 5
-- =============================================
Create PROCEDURE ajProc
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
CREATE TABLE [tb_Temp]([ID] INT,[Color] VARCHAR(10),[Count] INT)
INSERT INTO [tb_Temp]
SELECT [id],[color],[acount]
FROM [WuZi_Table] INNER JOIN [YanSe_Table]
ON [WuZi_Table].[Color_id] = [YanSe_Table].[Color_id]
DECLARE @s VARCHAR(2000)
SET @s='SELECT ID 物资编码'
SELECT @s = @s+',['+Color+']=SUM(CASE [Color] WHEN '''+Color+''' THEN [Count] ELSE 0 END)'
FROM [tb_Temp] GROUP BY [Color]
EXEC(@s+'from [tb_Temp] group by ID')
drop table [tb_Temp]
END
GO
EXEC ajProc
GO

浙公网安备 33010602011771号