SQL 行变列,高手进!

wangxiaofeiwuqiao 2010-05-15 08:54:14
name   date     xuqiu   gongying
塑胶1   2010-05-17   960   1255
塑胶1   2010-05-24   964   1254
塑胶2   2010-05-17   877   5266
塑胶2   2010-05-24   778   1500



SQL查询时变为如下形式:
    2010-05-17      2010-05-24
塑胶1    960(需求)       964(需求)
      1255(供应)      1254(供应)
塑胶2    877          778
      5266         1500


SQL语句怎么写,要具体点,不要存储过程。请高人指点!!

...全文
96 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxiaofeiwuqiao 2010-05-16
  • 打赏
  • 举报
回复
sql 区果然高手多阿。我先看看你们的方法,如果还有别的方法欢迎大家列出。分不是问题。
dawugui 2010-05-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhangsong841 的回复:]
老问题了,网上搜一下老乌龟的帖子吧,他是
行转列的老手
[/Quote]
我来晚了,参考楼上tony的.
htl258_Tony 2010-05-15
  • 打赏
  • 举报
回复
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-05-15 20:56:55
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
-- Blog : http://blog.csdn.net/htl258
----------------------------------------------------------------------------------

--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([name] [nvarchar](10),[date] [datetime],[xuqiu] [int],[gongying] [int])
INSERT INTO [tb]
SELECT '塑胶1','2010-05-17','960','1255' UNION ALL
SELECT '塑胶1','2010-05-24','964','1254' UNION ALL
SELECT '塑胶2','2010-05-17','877','5266' UNION ALL
SELECT '塑胶2','2010-05-24','778','1500'

--SELECT * FROM [tb]

-->SQL查询如下:
DECLARE @S VARCHAR(8000)
SELECT @S=isnull(@S+',','')+quotename(convert(VARCHAR,date,23)) FROM tb GROUP BY [date]
EXEC('
SELECT CASE TYPE WHEN ''gongying'' THEN '''' ELSE name END name,'+@S+'
FROM (
SELECT name,convert(VARCHAR,date,23) DATE,VALUE,TYPE
FROM tb
UNPIVOT(VALUE FOR TYPE IN(xuqiu,gongying)) B
) A
PIVOT(MAX(VALUE) FOR DATE IN('+@S+')) B
ORDER BY B.name,CASE TYPE WHEN ''gongying'' THEN 1 ELSE 0 END
')
/*
name 2010-05-17 2010-05-24
---------- ----------- -----------
塑胶1 960 964
1255 1254
塑胶2 877 778
5266 1500

(4 行受影响)
*/
供应需求对调一下。
htl258_Tony 2010-05-15
  • 打赏
  • 举报
回复
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-05-15 20:56:55
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
-- Blog : http://blog.csdn.net/htl258
----------------------------------------------------------------------------------

--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([name] [nvarchar](10),[date] [datetime],[xuqiu] [int],[gongying] [int])
INSERT INTO [tb]
SELECT '塑胶1','2010-05-17','960','1255' UNION ALL
SELECT '塑胶1','2010-05-24','964','1254' UNION ALL
SELECT '塑胶2','2010-05-17','877','5266' UNION ALL
SELECT '塑胶2','2010-05-24','778','1500'

--SELECT * FROM [tb]

-->SQL查询如下:
DECLARE @S VARCHAR(8000)
SELECT @S=isnull(@S+',','')+quotename(convert(VARCHAR,date,23)) FROM tb GROUP BY [date]
EXEC('
SELECT CASE TYPE WHEN ''gongying'' THEN name ELSE '''' END name,'+@S+'
FROM (
SELECT name,convert(VARCHAR,date,23) DATE,VALUE,TYPE
FROM tb
UNPIVOT(VALUE FOR TYPE IN(xuqiu,gongying)) B
) A
PIVOT(MAX(VALUE) FOR DATE IN('+@S+')) B
ORDER BY B.name,CASE TYPE WHEN ''gongying'' THEN 1 ELSE 2 END
')
/*
name 2010-05-17 2010-05-24
---------- ----------- -----------
塑胶1 1255 1254
960 964
塑胶2 5266 1500
877 778

(4 行受影响)
*/
zhangsong841 2010-05-15
  • 打赏
  • 举报
回复
老问题了,网上搜一下老乌龟的帖子吧,他是
行转列的老手

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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