有3个表 UserInfo、ProductInfo,SaleInfo
UserInfo 字段有
 userId   姓名
   1       张三
   2       李四
 ProdcutInfo 表的字段有
 productId   产品名称
      1       产品1
      2       产品2
SaleInfo 表的字段有
saseId  userId  productId  销售量 销售日期
  1        1       1         100     2009-07-10
  2        1       2         200      2009-07-10
  3        2       1         500      2009-07-12
  4        2       2         600      2009-07-12
我现在想通过SQL语句查出来的效果是如下样子:姓名     产品1    产品2    销售日期
张三      200     200       2009-07-10
李四      500     600       2009-07-12就是这样,经常会用到的交叉查询,可是我不会写,不知道从那里下手。请大家给我出出注意,解决这个问题,在线等待

解决方案 »

  1.   

    -------------------------------------------
    --  Author : liangCK 小梁
    --  Comment: 小梁 爱 兰儿
    --  Date   : 2009-07-12 14:36:22
    -------------------------------------------
     
    --> 生成测试数据: [UserInfo]
    IF OBJECT_ID('[UserInfo]') IS NOT NULL DROP TABLE [UserInfo]
    CREATE TABLE [UserInfo] (userId INT,姓名 VARCHAR(4))
    INSERT INTO [UserInfo]
    SELECT 1,'张三' UNION ALL
    SELECT 2,'李四'
     
    --> 生成测试数据: [ProdcutInfo]
    IF OBJECT_ID('[ProdcutInfo]') IS NOT NULL DROP TABLE [ProdcutInfo]
    CREATE TABLE [ProdcutInfo] (productId INT,产品名称 VARCHAR(5))
    INSERT INTO [ProdcutInfo]
    SELECT 1,'产品1' UNION ALL
    SELECT 2,'产品2'
     
    --> 生成测试数据: [SaleInfo]
    IF OBJECT_ID('[SaleInfo]') IS NOT NULL DROP TABLE [SaleInfo]
    CREATE TABLE [SaleInfo] (saseId INT,userId INT,productId INT,销售量 INT,销售日期 DATETIME)
    INSERT INTO [SaleInfo]
    SELECT 1,1,1,100,'2009-07-10' UNION ALL
    SELECT 2,1,2,200,'2009-07-10' UNION ALL
    SELECT 3,2,1,500,'2009-07-12' UNION ALL
    SELECT 4,2,2,600,'2009-07-12'--SQL查询如下:--动态
    DECLARE @cols VARCHAR(8000);
    SET @cols = '';SELECT
        @cols = @cols + ',SUM(CASE WHEN C.产品名称=''' 
                          + 产品名称 + ''' THEN B.销售量 ELSE 0 END) AS [' + 产品名称 + ']'
    FROM ProdcutInfo;EXEC('SELECT A.姓名'+@cols+',B.销售日期
          FROM UserInfo AS A
             JOIN SaleInfo AS B
          ON A.userId = B.userId
             JOIN ProdcutInfo AS C
          ON B.productId = C.productId
          GROUP BY A.姓名,B.销售日期')--静态:
    SELECT A.姓名,
       SUM(CASE WHEN C.产品名称='产品1' THEN B.销售量 ELSE 0 END) AS [产品1],
       SUM(CASE WHEN C.产品名称='产品2' THEN B.销售量 ELSE 0 END) AS [产品2],
       B.销售日期
    FROM UserInfo AS A
       JOIN SaleInfo AS B
    ON A.userId = B.userId
       JOIN ProdcutInfo AS C
    ON B.productId = C.productId
    GROUP BY A.姓名,B.销售日期/*
    姓名   产品1         产品2         销售日期
    ---- ----------- ----------- -----------------------
    李四   500         600         2009-07-12 00:00:00.000
    张三   100         200         2009-07-10 00:00:00.000(2 row(s) affected)
    */
      

  2.   

    我还有一个疑问就是,上面的 --SQL查询如下:--动态当产品新增时,我需要怎么修改才能实现同步
      

  3.   

    /*那我使用*/
    --动态
    DECLARE @cols VARCHAR(8000);
    SET @cols = '';SELECT
        @cols = @cols + ',SUM(CASE WHEN C.产品名称=''' 
                          + 产品名称 + ''' THEN B.销售量 ELSE 0 END) AS [' + 产品名称 + ']'
    FROM ProdcutInfo;EXEC('SELECT A.姓名'+@cols+',B.销售日期
          FROM UserInfo AS A
             JOIN SaleInfo AS B
          ON A.userId = B.userId
             JOIN ProdcutInfo AS C
          ON B.productId = C.productId
          GROUP BY A.姓名,B.销售日期')查不到结果。用静态的可以。@cols=‘’我应该写什么参数呢?我是很初初的SQL学习者