--> liangCK小梁 于2008-11-06
--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (期间 VARCHAR(6),公司 VARCHAR(24),分组 VARCHAR(4),金额 NUMERIC(10,6))
INSERT INTO #T
SELECT 'Jul-08','上海汉硕机械技术有限公司','E001',1082.14 UNION ALL
SELECT 'Aug-08','上海汉硕机械技术有限公司','E001',1276.782308 UNION ALL
SELECT 'Sep-08','上海汉硕机械技术有限公司','E001',4590.32668 UNION ALL
SELECT 'Jul-08','上海升辉模具器材有限公司','E001',2595.05 UNION ALL
SELECT 'Aug-08','上海升辉模具器材有限公司','E001',9469.585213 UNION ALL
SELECT 'Sep-08','上海升辉模具器材有限公司','E001',1142.57 UNION ALL
SELECT 'Jul-08','上海升辉模具器材有限公司','E003',500.86 UNION ALL
SELECT 'Aug-08','上海升辉模具器材有限公司','E003',63.25--SQL查询如下:--这是动态SQL,指"期间"列不定的情况下DECLARE @SQL NVARCHAR(4000);
SET @SQL='';SELECT @SQL=@SQL+',SUM(CASE WHEN 期间='''+期间+''' THEN 金额 ELSE 0 END) AS ['+期间+']'
FROM (SELECT DISTINCT 期间 FROM #T) AS t;EXEC ('SELECT 公司,分组'+@SQL+' FROM #T GROUP BY 公司,分组');
--这是静态SQL,指"期间"是固定的情况下
SELECT 公司,
分组,
SUM(CASE WHEN 期间='Aug-08' THEN 金额 ELSE 0 END) AS [Aug-08],
SUM(CASE WHEN 期间='Jul-08' THEN 金额 ELSE 0 END) AS [Jul-08],
SUM(CASE WHEN 期间='Sep-08' THEN 金额 ELSE 0 END) AS [Sep-08]
FROM #T
GROUP BY 公司,分组;
/*
公司 分组 Aug-08 Jul-08 Sep-08
------------------------ ---- --------------------------------------- --------------------------------------- ---------------------------------------
上海汉硕机械技术有限公司 E001 1276.782308 1082.140000 4590.326680
上海升辉模具器材有限公司 E001 9469.585213 2595.050000 1142.570000
上海升辉模具器材有限公司 E003 63.250000 500.860000 0.000000(3 行受影响)
*/
--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (期间 VARCHAR(6),公司 VARCHAR(24),分组 VARCHAR(4),金额 NUMERIC(10,6))
INSERT INTO #T
SELECT 'Jul-08','上海汉硕机械技术有限公司','E001',1082.14 UNION ALL
SELECT 'Aug-08','上海汉硕机械技术有限公司','E001',1276.782308 UNION ALL
SELECT 'Sep-08','上海汉硕机械技术有限公司','E001',4590.32668 UNION ALL
SELECT 'Jul-08','上海升辉模具器材有限公司','E001',2595.05 UNION ALL
SELECT 'Aug-08','上海升辉模具器材有限公司','E001',9469.585213 UNION ALL
SELECT 'Sep-08','上海升辉模具器材有限公司','E001',1142.57 UNION ALL
SELECT 'Jul-08','上海升辉模具器材有限公司','E003',500.86 UNION ALL
SELECT 'Aug-08','上海升辉模具器材有限公司','E003',63.25--SQL查询如下:--这是动态SQL,指"期间"列不定的情况下DECLARE @SQL NVARCHAR(4000);
SET @SQL='';SELECT @SQL=@SQL+',SUM(CASE WHEN 期间='''+期间+''' THEN 金额 ELSE 0 END) AS ['+期间+']'
FROM (SELECT DISTINCT 期间 FROM #T) AS t;EXEC ('SELECT 公司,分组'+@SQL+' FROM #T GROUP BY 公司,分组');
--这是静态SQL,指"期间"是固定的情况下
SELECT 公司,
分组,
SUM(CASE WHEN 期间='Aug-08' THEN 金额 ELSE 0 END) AS [Aug-08],
SUM(CASE WHEN 期间='Jul-08' THEN 金额 ELSE 0 END) AS [Jul-08],
SUM(CASE WHEN 期间='Sep-08' THEN 金额 ELSE 0 END) AS [Sep-08]
FROM #T
GROUP BY 公司,分组;
/*
公司 分组 Aug-08 Jul-08 Sep-08
------------------------ ---- --------------------------------------- --------------------------------------- ---------------------------------------
上海汉硕机械技术有限公司 E001 1276.782308 1082.140000 4590.326680
上海升辉模具器材有限公司 E001 9469.585213 2595.050000 1142.570000
上海升辉模具器材有限公司 E003 63.250000 500.860000 0.000000(3 行受影响)
*/
INSERT TB
SELECT N'Jul-08', N'上海汉硕机械技术有限公司', N'E001', 1082.14 UNION ALL
SELECT N'Aug-08', N'上海汉硕机械技术有限公司', N'E001', 1276.782308 UNION ALL
SELECT N'Sep-08', N'上海汉硕机械技术有限公司', N'E001', 4590.32668 UNION ALL
SELECT N'Jul-08', N'上海升辉模具器材有限公司', N'E001', 2595.05 UNION ALL
SELECT N'Aug-08', N'上海升辉模具器材有限公司', N'E001', 9469.585213 UNION ALL
SELECT N'Sep-08', N'上海升辉模具器材有限公司', N'E001', 1142.57 UNION ALL
SELECT N'Jul-08', N'上海升辉模具器材有限公司', N'E003', 500.86 UNION ALL
SELECT N'Aug-08', N'上海升辉模具器材有限公司', N'E003', 63.25DECLARE @SQL VARCHAR(8000)
SET @SQL=''
SELECT @SQL=@SQL+','+' SUM(CASE WHEN PERIOD='''+PERIOD+''' THEN AMT ELSE 0 END) AS ['+PERIOD+']'
FROM TB
GROUP BY PERIODSET @SQL='SELECT COMP,GRP'+@SQL+' FROM TB GROUP BY COMP,GRP'--PRINT @SQL
EXEC(@SQL)DROP TABLE TB
/*
COMP GRP Aug-08 Jul-08 Sep-08
-------------------------------------------------- ---------- ----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
上海升辉模具器材有限公司 E001 9469.5852130000003 2595.0500000000002 1142.5699999999999
上海汉硕机械技术有限公司 E001 1276.7823080000001 1082.1400000000001 4590.3266800000001
上海升辉模具器材有限公司 E003 63.25 500.86000000000001 0.0
*/