怎么规定字段的显示位置

a5918886 2010-04-01 05:28:29
两张表表连接查询。出来的效果是

产品 掺配累积量 掺配比例 掺配精度
红丝 50 0.21 ss

绿丝 60 0.22 ss


怎么改成这种效果,各位大侠帮帮忙。


产品 红丝 绿丝
掺配累积量 50 60
掺配比例 0.21 0.22
掺配精度 ss ss



具体数据库脚本如下

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Infor]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Infor](
[productId] [int] IDENTITY(1,1) NOT NULL,
[productName] [nvarchar](5) NULL,
CONSTRAINT [PK_Infor] PRIMARY KEY CLUSTERED
(
[productId] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[test]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[test](
[产品ID] [int] NULL,
[掺配累计量] [int] NULL,
[掺配比例] [nvarchar](20) NULL,
[掺配精度] [nvarchar](20) NULL
) ON [PRIMARY]
END
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_test_Infor]') AND parent_object_id = OBJECT_ID(N'[dbo].[test]'))
ALTER TABLE [dbo].[test] WITH CHECK ADD CONSTRAINT [FK_test_Infor] FOREIGN KEY([产品ID])
REFERENCES [dbo].[Infor] ([productId])
...全文
79 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
a5918886 2010-04-02
  • 打赏
  • 举报
回复
帮忙搞搞啊,哥么!
a5918886 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 htl258 的回复:]
引用 9 楼 a5918886 的回复:
引用 3 楼 dawugui 的回复:
参考这个:


SQL code
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[p_zj]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedu……
[/Quote]

我是 红丝 和绿丝 是一张表
掺配累积量 掺配比例 掺配精度是一张表
然后两张连接查询出来,效果是

产品 掺配累积量 掺配比例 掺配精度
红丝 50 0.21 ss

绿丝 60 0.22 ss

但是我想要的效果是

产品 红丝 绿丝
掺配累积量 50 60
掺配比例 0.21 0.22
掺配精度 ss ss
htl258_Tony 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 a5918886 的回复:]
引用 3 楼 dawugui 的回复:
参考这个:


SQL code
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[p_zj]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_zj]
GO
/……
[/Quote]哪两张?
a5918886 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
参考这个:


SQL code
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[p_zj]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_zj]
GO
/*--行列互换的通用存储过程(原著:邹建)……
[/Quote]


哥么们 我的是两张表!一张表我也会写哇。刚注意到!
a5918886 2010-04-02
  • 打赏
  • 举报
回复
哈哈,因为比较急,所以多贴了几张,让各位见笑了!再次谢谢各位的帮助!
-狙击手- 2010-04-01
  • 打赏
  • 举报
回复
------------------------------------------------------------------------
-- Author : happyflystone
-- Date : 2010-04-01
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
--
------------------------------------------------------------------------

-- Test Data: ta
IF OBJECT_ID('[ta]') IS NOT NULL
DROP TABLE [ta]
Go
CREATE TABLE ta([产品] NVARCHAR(2),[掺配累积量] NVARCHAR(12),[掺配比例] NVARCHAR(12),[掺配精度] NVARCHAR(12))
Go
INSERT INTO ta
SELECT '红丝','50','0.21','ss' UNION ALL
SELECT '绿丝','60','0.22','ss'
GO
--Start
SELECT *
FROM
(
SELECT [产品],[col1],[col2]
FROM
(select * from ta) p
UNPIVOT
( [col1]
FOR [col2] IN ([掺配累积量] ,[掺配比例] ,[掺配精度])
)AS UNPVT) p
PIVOT
(MAX(col1) FOR [产品] IN(红丝,绿丝)) PVT





--Result:
/*
col2 红丝 绿丝
---------------------- ------------ ------------
掺配比例 0.21 0.22
掺配精度 ss ss
掺配累积量 50 60

(3 行受影响)


*/
--End
htl258_Tony 2010-04-01
  • 打赏
  • 举报
回复
--------------------------------------------------------------------------
-- AUTHOR : HTL258(TONY)
-- DATE : 2010-04-01 17:29:47
-- VERSION:MICROSOFT SQL SERVER 2008 (SP1) - 10.0.2531.0 (INTEL X86)
-- MAR 29 2009 10:27:29
-- COPYRIGHT (C) 1988-2008 MICROSOFT CORPORATION
-- DEVELOPER EDITION ON WINDOWS NT 5.1 <X86> (BUILD 2600: SERVICE PACK 2)
--------------------------------------------------------------------------
--> 生成测试数据表:TB

IF NOT OBJECT_ID('[TB]') IS NULL
DROP TABLE [TB]
GO
CREATE TABLE [TB]([产品] NVARCHAR(10),[掺配累积量] INT,[掺配比例] NVARCHAR(10),[掺配精度] NVARCHAR(10))
INSERT [TB]
SELECT N'红丝',50,'0.21','SS' UNION ALL
SELECT N'绿丝',60,'0.22','SS'
GO
--SELECT * FROM [TB]

-->SQL查询如下:

SELECT *
FROM (
SELECT 产品 B,CAST([掺配累积量] AS VARCHAR(100)) [掺配累积量],CAST([掺配比例] AS VARCHAR(100)) [掺配比例],CAST([掺配精度] AS VARCHAR(100)) [掺配精度]
FROM TB
) A
UNPIVOT(A FOR 产品 IN([掺配累积量],[掺配比例],[掺配精度])) B
PIVOT(MAX(A) FOR B IN(红丝,绿丝)) C
/*
产品 红丝 绿丝
掺配比例 0.21 0.22
掺配精度 SS SS
掺配累积量 50 60
*/
--小F-- 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dawugui 的回复:]
这次贴晚了.
[/Quote]

嘿嘿
dawugui 2010-04-01
  • 打赏
  • 举报
回复
这次贴晚了.
dawugui 2010-04-01
  • 打赏
  • 举报
回复
参考这个:

if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[p_zj]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_zj]
GO
/*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/

create proc p_zj
@tbname sysname, --要处理的表名
@fdname sysname, --做为转换的列名
@new_fdname sysname='' --为转换后的列指定列名
as
declare @s1 varchar(8000) , @s2 varchar(8000),
@s3 varchar(8000) , @s4 varchar(8000),
@s5 varchar(8000) , @i varchar(10)
select @s1 = '' , @s2 = '' , @s3 = '' , @s4 = '' , @s5 = '' , @i = '0'
select @s1 = @s1 + ',@' + @i + ' varchar(8000)',
@s2 = @s2 + ',@' + @i + '=''' + case isnull(@new_fdname , '') when '' then ''
else @new_fdname + '=' end + '''''' + name + '''''''',
@s3 = @s3 + 'select @' + @i + '=@' + @i + '+'',['' + [' + @fdname +
']+'']=''+cast([' + name + '] as varchar) from [' + @tbname + ']',
@s4 = @s4 + ',@' + @i + '=''select ''+@' + @i,
@s5 = @s5 + '+'' union all ''+@' + @i,
@i=cast(@i as int)+1
from syscolumns
where object_id(@tbname)=id and name<>@fdname

select @s1=substring(@s1,2,8000),
@s2=substring(@s2,2,8000),
@s4=substring(@s4,2,8000),
@s5=substring(@s5,16,8000)
exec('declare ' + @s1 + 'select ' + @s2 + @s3 + 'select ' + @s4 + '
exec(' + @s5 + ')')
go

--用上面的存储过程测试:

create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
insert Test
select '1月',100,200,300 union all
select '2月',110,210,310 union all
select '3月',120,220,320 union all
select '4月',130,230,330
go

exec p_zj 'Test', '月份' , '项目'

drop table Test
drop proc p_zj

/*
项目 1月 2月 3月 4月
---- ----------- ----------- ----------- -----------
福利 200 210 220 230
工资 100 110 120 130
奖金 300 310 320 330

(所影响的行数为 3 行)
*/

/*
静态写法(SQL2005)
*/
--测试环境
create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
insert Test
select '1月',100,200,300 union all
select '2月',110,210,310 union all
select '3月',120,220,320 union all
select '4月',130,230,330
go
--测试语句
SELECT * FROM
(
SELECT 考核月份,月份,金额 FROM
(SELECT 月份, 工资, 福利, 奖金 FROM Test) p
UNPIVOT
(金额 FOR 考核月份 IN (工资, 福利, 奖金))AS unpvt
) T
PIVOT
(MAX(金额) FOR 月份 in ([1月],[2月],[3月],[4月]))AS pt

--测试结果

/*
考核月份 1月 2月 3月 4月
------- ----- ----- ------ -------
福利200210220230
工资100110120130
奖金300310320330
*/

--删除环境
Drop table Test

--小F-- 2010-04-01
  • 打赏
  • 举报
回复
----------------------------------------------------------------------------
/*
表tb,数据如下:
项目种类 业绩 提成
洗吹类  200 10
外卖 100 5
合计 300 15
转换成:
项目种类 洗吹类 外卖 合计
业绩 200 100 300
提成 10 5 15
*/

create table tb
(
项目种类 varchar(10),
业绩 int,
提成 int
)

insert into tb(项目种类,业绩,提成) values('洗吹类',200,10)
insert into tb(项目种类,业绩,提成) values('外卖' ,100,5)
insert into tb(项目种类,业绩,提成) values('合计' ,300,15)
go

select 项目种类,sum(洗吹类) as 洗吹类 , sum(外卖) as 外卖 , sum(合计) as 合计 from
(
select 项目种类 = '业绩',
洗吹类 = case when 项目种类 = '洗吹类' then 业绩 else 0 end,
外卖 = case when 项目种类 = '外卖' then 业绩 else 0 end,
合计 = case when 项目种类 = '合计' then 业绩 else 0 end
from tb
union all
select 项目种类 = '提成' ,
洗吹类 = case when 项目种类 = '洗吹类' then 提成 else 0 end,
外卖 = case when 项目种类 = '外卖' then 提成 else 0 end,
合计 = case when 项目种类 = '合计' then 提成 else 0 end
from tb
) m
group by 项目种类
order by 项目种类 desc

drop table tb

/*
项目种类 洗吹类 外卖 合计
-------- ----------- ----------- -----------
业绩 200 100 300
提成 10 5 15

(所影响的行数为 2 行)
*/

--------------------------------------------------------------------------
/*
数据库中tb表格如下

月份 工资 福利 奖金
1月 100 200 300
2月 110 210 310
3月 120 220 320
4月 130 230 330

我想得到的结果是

项目 1月 2月 3月 4月
工资 100 110 120 130
福利 200 210 220 230
奖金 300 310 320 330

就是说完全把表格的行列颠倒,有点像那种旋转矩阵,请问如何用sql 语句实现?
*/

if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[p_zj]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_zj]
GO
/*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/

create proc p_zj
@tbname sysname, --要处理的表名
@fdname sysname, --做为转换的列名
@new_fdname sysname='' --为转换后的列指定列名
as
declare @s1 varchar(8000) , @s2 varchar(8000),
@s3 varchar(8000) , @s4 varchar(8000),
@s5 varchar(8000) , @i varchar(10)
select @s1 = '' , @s2 = '' , @s3 = '' , @s4 = '' , @s5 = '' , @i = '0'
select @s1 = @s1 + ',@' + @i + ' varchar(8000)',
@s2 = @s2 + ',@' + @i + '=''' + case isnull(@new_fdname , '') when '' then ''
else @new_fdname + '=' end + '''''' + name + '''''''',
@s3 = @s3 + 'select @' + @i + '=@' + @i + '+'',['' + [' + @fdname +
']+'']=''+cast([' + name + '] as varchar) from [' + @tbname + ']',
@s4 = @s4 + ',@' + @i + '=''select ''+@' + @i,
@s5 = @s5 + '+'' union all ''+@' + @i,
@i=cast(@i as int)+1
from syscolumns
where object_id(@tbname)=id and name<>@fdname

select @s1=substring(@s1,2,8000),
@s2=substring(@s2,2,8000),
@s4=substring(@s4,2,8000),
@s5=substring(@s5,16,8000)
exec('declare ' + @s1 + 'select ' + @s2 + @s3 + 'select ' + @s4 + '
exec(' + @s5 + ')')
go

--用上面的存储过程测试:

create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
insert Test
select '1月',100,200,300 union all
select '2月',110,210,310 union all
select '3月',120,220,320 union all
select '4月',130,230,330
go

exec p_zj 'Test', '月份' , '项目'

drop table Test
drop proc p_zj

/*
项目 1月 2月 3月 4月
---- ----------- ----------- ----------- -----------
福利 200 210 220 230
工资 100 110 120 130
奖金 300 310 320 330

(所影响的行数为 3 行)
*/

/*
静态写法(SQL2005)
*/
--测试环境
create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
insert Test
select '1月',100,200,300 union all
select '2月',110,210,310 union all
select '3月',120,220,320 union all
select '4月',130,230,330
go
--测试语句
SELECT * FROM
(
SELECT 考核月份,月份,金额 FROM
(SELECT 月份, 工资, 福利, 奖金 FROM Test) p
UNPIVOT
(金额 FOR 考核月份 IN (工资, 福利, 奖金))AS unpvt
) T
PIVOT
(MAX(金额) FOR 月份 in ([1月],[2月],[3月],[4月]))AS pt

--测试结果

/*
考核月份 1月 2月 3月 4月
------- ----- ----- ------ -------
福利200210220230
工资100110120130
奖金300310320330
*/

--删除环境
Drop table Test
-狙击手- 2010-04-01
  • 打赏
  • 举报
回复
哥们,这。。。

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧