有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就是这样,经常会用到的交叉查询,可是我不会写,不知道从那里下手。请大家给我出出注意,解决这个问题,在线等待
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就是这样,经常会用到的交叉查询,可是我不会写,不知道从那里下手。请大家给我出出注意,解决这个问题,在线等待
-- 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)
*/
--动态
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学习者