--> 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 行受影响)
*/

解决方案 »

  1.   

    CREATE TABLE TB(PERIOD NVARCHAR(6),COMP NVARCHAR(50),GRP NVARCHAR(10), AMT FLOAT)
    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
    */