为什么是最大值呢?

德仔 2010-08-12 05:45:53
问题:行转列,可获取的数量是最大值,而不是具体值,请各位帮忙,谢谢

Table:
CREATE TABLE [dbo].[PSALE_SALE] (
[SALEID] int IDENTITY(1, 1) NOT NULL,
[Agent_ID] int NOT NULL,
[Sale_Year] int NOT NULL,
[Sale_Month] int NOT NULL,
[Sale_Day] int NOT NULL,
[Product_ID] int NOT NULL,
[Quantity] int NOT NULL,
CONSTRAINT [PK_PSALE_SALE] PRIMARY KEY CLUSTERED ([SALEID])
)
ON [PRIMARY]
GO

数据:


/* Data for the `dbo.PSALE_SALE` table (Records 1 - 21) */


INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (36, 13, 2010, 8, 10, 22, 44)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (37, 13, 2010, 8, 10, 21, 9)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (38, 13, 2010, 8, 10, 17, 55)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (39, 13, 2010, 8, 10, 12, 7)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (40, 13, 2010, 8, 10, 20, 8)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (41, 13, 2010, 8, 10, 19, 9)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (42, 13, 2010, 8, 10, 15, 7)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (43, 15, 2010, 8, 12, 22, 33)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (44, 15, 2010, 8, 12, 21, 44)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (45, 15, 2010, 8, 12, 17, 55)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (46, 15, 2010, 8, 12, 12, 66)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (47, 15, 2010, 8, 12, 20, 7)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (48, 15, 2010, 8, 12, 19, 8)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (49, 15, 2010, 8, 12, 15, 99)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (50, 17, 2010, 8, 12, 22, 55)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (51, 17, 2010, 8, 12, 21, 5)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (52, 17, 2010, 8, 12, 17, 67)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (53, 17, 2010, 8, 12, 12, 89)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (54, 17, 2010, 8, 12, 20, 44)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (55, 17, 2010, 8, 12, 19, 3)
GO

INSERT INTO [dbo].[PSALE_SALE] ([SALEID], [Agent_ID], [Sale_Year], [Sale_Month], [Sale_Day], [Product_ID], [Quantity])
VALUES (56, 17, 2010, 8, 12, 15, 33)
GO



SqlScript:

declare @sql varchar(8000)
set @sql='select Agent_ID,sale_year,sale_month,sale_day '
select @sql=@sql+' , max(case Product_ID when convert(varchar(20),Product_ID) then Quantity else 0 end) as ['+ convert(varchar(20),Product_ID)+']'
from (select distinct Product_ID from PSALE_SALE ) as a
set @sql=@sql+' from PSALE_SALE where sale_year=2010 and sale_month=8 and sale_day=10 and agent_id=13 group by Agent_ID,Sale_Year,Sale_Month,Sale_Day '
exec(@sql)

结果:

13 2010 8 10 55 55 55 55 55 55 55

而正确的值应该是跟下面一样的
select * from PSALE_SALE where sale_year=2010 and sale_month=8 and sale_day=10 and agent_id=13 order by product_id


不知哪里出错,求解.
...全文
113 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
small_tree 2010-08-12
  • 打赏
  • 举报
回复
哎。。抱怨一下自己公司,妈的,需求就有问题,乱七八糟,自己都不知道要啥,还要做出东西来,愤恨,无比愤恨
德仔 2010-08-12
  • 打赏
  • 举报
回复
5,感谢大家。
small_tree 2010-08-12
  • 打赏
  • 举报
回复
你的sql print 出来是下面那样的,

你的case when 肯定错了,、

CASE Product_ID
WHEN CONVERT(VARCHAR(20), Product_ID) THEN Quantity
ELSE 0
END) AS [12]

我不知道你写这个SQL的逻辑是啥。。。。但是你应该知道的是,case when的用法
CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END
Searched CASE function:
CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END




SELECT Agent_ID ,
sale_year ,
sale_month ,
sale_day ,
MAX(CASE Product_ID
WHEN CONVERT(VARCHAR(20), Product_ID) THEN Quantity
ELSE 0
END) AS [12] ,
MAX(CASE Product_ID
WHEN CONVERT(VARCHAR(20), Product_ID) THEN Quantity
ELSE 0
END) AS [15] ,
MAX(CASE Product_ID
WHEN CONVERT(VARCHAR(20), Product_ID) THEN Quantity
ELSE 0
END) AS [17] ,
MAX(CASE Product_ID
WHEN CONVERT(VARCHAR(20), Product_ID) THEN Quantity
ELSE 0
END) AS [19] ,
MAX(CASE Product_ID
WHEN CONVERT(VARCHAR(20), Product_ID) THEN Quantity
ELSE 0
END) AS [20] ,
MAX(CASE Product_ID
WHEN CONVERT(VARCHAR(20), Product_ID) THEN Quantity
ELSE 0
END) AS [21] ,
MAX(CASE Product_ID
WHEN CONVERT(VARCHAR(20), Product_ID) THEN Quantity
ELSE 0
END) AS [22]
FROM PSALE_SALE
WHERE sale_year = 2010
AND sale_month = 8
AND sale_day = 10
AND agent_id = 13
GROUP BY

Sale_Year ,
Sale_Month ,
Sale_Day





德仔 2010-08-12
  • 打赏
  • 举报
回复
我的意思是product_id的值应该跟这个一样,可能我表述得有点不对头。不好意思。
王向飞 2010-08-12
  • 打赏
  • 举报
回复
DECLARE @sql VARCHAR(8000)
SET @sql = 'select Agent_ID,[Sale_Year],[Sale_Month],[Sale_Day] '
SELECT @sql = @sql
+ ' , max(case Product_ID when '+CONVERT(VARCHAR(20), Product_ID)+' then Quantity else 0 end) as ['
+ CONVERT(VARCHAR(20), Product_ID) + ']'
FROM ( SELECT DISTINCT
Product_ID
FROM PSALE_SALE
) AS a
SET @sql = @sql
+ ' from PSALE_SALE where [Sale_Year]=2010
and [Sale_Month]=8
and [Sale_Day]=10
and Agent_ID=13
group by Agent_ID,Sale_Year,Sale_Month,Sale_Day '
exec (@sql)

---
Agent_ID Sale_Year Sale_Month Sale_Day 12 15 17 19 20 21 22
13 2010 8 10 7 7 55 9 8 9 44
small_tree 2010-08-12
  • 打赏
  • 举报
回复
为什么你刚刚说

而正确的值应该是跟下面一样的
select * from PSALE_SALE where sale_year=2010 and sale_month=8 and sale_day=10 and agent_id=13 order by product_id

? 这段只有一条记录吗?
德仔 2010-08-12
  • 打赏
  • 举报
回复
13 2010 8 10 44 44 44 44 44 44 44
13 2010 8 10 9 9 9 9 9 9 9
13 2010 8 10 55 55 55 55 55 55 55
13 2010 8 10 7 7 7 7 7 7 7
13 2010 8 10 8 8 8 8 8 8 8
13 2010 8 10 9 9 9 9 9 9 9
13 2010 8 10 7 7 7 7 7 7 7

正确的应该是一条记录:
13 2010 8 10 44 9 55 7 8 9 7
德仔 2010-08-12
  • 打赏
  • 举报
回复
也不对,这下的值多了几列,也都是重复的
small_tree 2010-08-12
  • 打赏
  • 举报
回复
group by的时候,少了saleID



DECLARE @sql VARCHAR(8000)
SET @sql = 'select Agent_ID,sale_year,sale_month,sale_day '
SELECT @sql = @sql
+ ' , max(case Product_ID when convert(varchar(20),Product_ID) then Quantity else 0 end) as ['
+ CONVERT(VARCHAR(20), Product_ID) + ']'
FROM ( SELECT DISTINCT
Product_ID
FROM PSALE_SALE
) AS a
SET @sql = @sql
+ ' from PSALE_SALE where sale_year=2010 and sale_month=8 and sale_day=10 and agent_id=13 group by saleid, Agent_ID,Sale_Year,Sale_Month,Sale_Day '

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧