现在:
表1:
city   county    species    count湛江   霞山       绿色      1000
湛江   霞山       红色      1000
南宁   百色       红色      2000表2:
city    county    watername    count1  湛江     霞山       淡水        1000   
湛江     霞山       深水        2000  现在想得到的表是(最好是视图)
表3:
city  country   species1  count1  species2   count2  species3  count3  water1  c1    water2   c2湛江   霞山      绿色      1000    红色      1000                      淡水   1000   深水    2000
补充说明:表1的species字段的个数可能会变化,因为表中暂时没有这个品种,如表3中species3 就没有了数据,没有的希望就为空串,同样,表2中的watername也是这样。
麻烦高手帮我解决,有兴趣的大家一起学习一下。thanks!!

解决方案 »

  1.   

    动态sql 用case when 查阅精华区
      

  2.   


    /*---------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2009-09-13 11:55:31
    --  Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) 
    Mar 29 2009 10:27:29 
    Copyright (c) 1988-2008 Microsoft Corporation
    Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/
    --> 生成测试数据表:t1IF NOT OBJECT_ID('[t1]') IS NULL
    DROP TABLE [t1]
    GO
    CREATE TABLE [t1]([city] NVARCHAR(10),[county] NVARCHAR(10),[species] NVARCHAR(10),[count] INT)
    INSERT [t1]
    SELECT N'湛江',N'霞山',N'绿色',1000 UNION ALL
    SELECT N'湛江',N'霞山',N'红色',1000 UNION ALL
    SELECT N'南宁',N'百色',N'红色',2000
    GO
    --SELECT * FROM [t1]--> 生成测试数据表:t2IF NOT OBJECT_ID('[t2]') IS NULL
    DROP TABLE [t2]
    GO
    CREATE TABLE [t2]([city] NVARCHAR(10),[county] NVARCHAR(10),[watername] NVARCHAR(10),[count1] INT)
    INSERT [t2]
    SELECT N'湛江',N'霞山',N'淡水',1000 UNION ALL
    SELECT N'湛江',N'霞山',N'深水',2000
    GO
    --SELECT * FROM [t2]-->SQL查询如下:
    DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
    SELECT @s=ISNULL(@s+',','')+QUOTENAME(a.species)
    FROM T1 a
    INNER JOIN t2 b
    ON a.[city]=b.[city] AND a.[county]=b.[county]
    GROUP BY a.species
    SELECT @s1=ISNULL(@s1+',','')+QUOTENAME(b.watername)
    FROM T1 a
    INNER JOIN t2 b
    ON a.[city]=b.[city] AND a.[county]=b.[county]
    GROUP BY b.watername
    EXEC('
    SELECT *
    FROM (
    SELECT a.city,a.county,a.species,a.[count],b.watername,b.count1
    FROM T1 a
    INNER JOIN t2 b
    ON a.[city]=b.[city] AND a.[county]=b.[county]
    ) AS a
    PIVOT (MAX([count]) FOR species IN('+@s+')) AS b
    PIVOT (MAX(count1) FOR watername IN('+@s1+')) AS c
    ')
    /*
    city       county     红色          绿色          淡水          深水
    ---------- ---------- ----------- ----------- ----------- -----------
    湛江         霞山         1000        1000        1000        2000(1 行受影响)
    */
      

  3.   

    htl258(tony) 你好,请问你有时间跟我讲讲你写的这些sql语句吗?
      

  4.   

    这个你得先了解一下pivot函数的应用.