27,580
社区成员
发帖
与我相关
我的任务
分享
select
a.产品编码,b.类别,
max(case b.输入类型 when '选择' then c.选择项 else '' end) as 选择项,
max(case b.类别名称 when '生产日期' then d.属性值 else '' end) as 生产日期,
max(case b.类别名称 when '批号' then d.属性值 else '' end) as 批号,
max(case b.类别名称 when '保质期' then d.属性值 else '' end) as 保质期
from
a,b,c,d
where
a.产品编码=d.产品编码
and
b.id=c.表B的id
and
b.id=d.表B的id
group by
a.产品编码,b.类别
;with cte as
(select d.*,b.类别名称,b.类别,value=d.属性值 from d full join B on d.[表B的id]=b.id where b.输入类型!=N'选择'
union all
select d.*,b.类别名称,b.类别,c.选择项 from d full join B on d.[表B的id]=b.id inner join c on d.[表B的id]=c.[表B的id] and cast(d.属性值 as int)=c.id where b.输入类型=N'选择'
)
select * into #temp from cte --插入临时表
DECLARE @SQL NVARCHAR(4000)
SET @SQL = N'SELECT 产品编码,类别=min(类别)+'',''+max(类别)'
SELECT @SQL = @SQL + N' , MAX(CASE 类别名称 WHEN N''' + 类别名称 + ''' THEN ltrim([value]) ELSE '''' END) [' + 类别名称 + ']'
FROM (SELECT DISTINCT 类别名称 FROM B) AS A
SET @SQL = @SQL + N' FROM #temp GROUP BY 产品编码 order by 产品编码'
EXEC(@SQL)
/** --这种情况你也试一下
DECLARE @SQL NVARCHAR(4000)
SET @SQL = N'SELECT 产品编码,类别 '
SELECT @SQL = @SQL + N' , MAX(CASE 类别名称 WHEN N''' + 类别名称 + ''' THEN ltrim([value]) ELSE '''' END) [' + 类别名称 + ']'
FROM (SELECT DISTINCT 类别名称 FROM B) AS A
SET @SQL = @SQL + N' FROM #temp GROUP BY 产品编码,类别 order by 产品编码,类别'
EXEC(@SQL)
**/
产品编码 类别 保质期 批号 生产日期
-------------------------------------------------- ----------------------------------------------------------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
245588 酒类,食品类 30 10151545 选择3
400001 酒类,食品类 30 10151545 选择1
400214 酒类,食品类 30 10151525 选择2
5647489 酒类,食品类 15 6858528 选择2
(4 行受影响)
;with cte as
(select d.*,b.类别名称,b.类别,value=d.属性值 from d full join B on d.[表B的id]=b.id where b.输入类型!=N'选择'
union all
select d.*,b.类别名称,b.类别,c.选择项 from d full join B on d.[表B的id]=b.id inner join c on d.[表B的id]=c.[表B的id] and cast(d.属性值 as int)=c.id where b.输入类型=N'选择'
)
select
产品编码,类别,
max(case 类别名称 when N'生产日期' then ltrim([value]) else '' end) as 生产日期,
max(case 类别名称 when N'批号' then ltrim([value]) else '' end) as 批号,
max(case 类别名称 when N'保质期' then ltrim([value]) else '' end) as 保质期
from cte where 类别=N'酒类'
group by 产品编码,类别
产品编码 类别 生产日期 批号 保质期
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
245588 酒类 选择3 10151545
400001 酒类 选择1 10151545
400214 酒类 选择2 10151525
5647489 酒类 选择2 6858528
(4 行受影响)
USE [master]
GO
/****** Object: Table [dbo].[C] Script Date: 11/04/2010 15:11:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[C]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[C](
[id] [varchar](50) NOT NULL,
[选择项] [varchar](50) NULL,
[表B的id] [varchar](50) NULL,
CONSTRAINT [PK_C] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[C] ([id], [选择项], [表B的id]) VALUES (N'3', N'选择1', N'1')
INSERT [dbo].[C] ([id], [选择项], [表B的id]) VALUES (N'5', N'选择2', N'1')
INSERT [dbo].[C] ([id], [选择项], [表B的id]) VALUES (N'6', N'选择3', N'1')
/****** Object: Table [dbo].[A] Script Date: 11/04/2010 15:11:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[A]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[A](
[id] [varchar](50) NOT NULL,
[产品编码] [varchar](50) NULL,
[类别] [varchar](50) NULL,
CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[A] ([id], [产品编码], [类别]) VALUES (N'1', N'400001', N'酒类')
INSERT [dbo].[A] ([id], [产品编码], [类别]) VALUES (N'2', N'400214', N'酒类')
INSERT [dbo].[A] ([id], [产品编码], [类别]) VALUES (N'5', N'245588', N'酒类')
INSERT [dbo].[A] ([id], [产品编码], [类别]) VALUES (N'6', N'455468', N'食品类')
INSERT [dbo].[A] ([id], [产品编码], [类别]) VALUES (N'7', N'541654', N'酒类')
INSERT [dbo].[A] ([id], [产品编码], [类别]) VALUES (N'8', N'5647489', N'酒类')
INSERT [dbo].[A] ([id], [产品编码], [类别]) VALUES (N'9', N'548489', N'酒类')
/****** Object: Table [dbo].[B] Script Date: 11/04/2010 15:11:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[B]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[B](
[ID] [varchar](50) NOT NULL,
[类别名称] [varchar](50) NULL,
[类别] [varchar](50) NULL,
[输入类型] [varchar](50) NULL,
CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[B] ([ID], [类别名称], [类别], [输入类型]) VALUES (N'1', N'生产日期', N'酒类', N'选择')
INSERT [dbo].[B] ([ID], [类别名称], [类别], [输入类型]) VALUES (N'2', N'批号', N'酒类', N'文本')
INSERT [dbo].[B] ([ID], [类别名称], [类别], [输入类型]) VALUES (N'7', N'保质期', N'食品类', N'文本')
/****** Object: Table [dbo].[D] Script Date: 11/04/2010 15:11:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[D]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[D](
[id] [varchar](50) NOT NULL,
[产品编码] [varchar](50) NULL,
[表B的id] [varchar](50) NULL,
[属性值] [varchar](50) NULL,
CONSTRAINT [PK_D] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'10', N'400214', N'7', N'30')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'11', N'245588', N'1', N'6')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'12', N'245588', N'2', N'10151545')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'13', N'245588', N'7', N'30')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'14', N'5647489', N'1', N'5')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'15', N'5647489', N'2', N'6858528')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'16', N'5647489', N'7', N'15')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'5', N'400001', N'1', N'3')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'6', N'400001', N'2', N'10151545')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'7', N'400001', N'7', N'30')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'8', N'400214', N'1', N'5')
INSERT [dbo].[D] ([id], [产品编码], [表B的id], [属性值]) VALUES (N'9', N'400214', N'2', N'10151525')