大侠们 给个痛快的吧

b283992238 2012-09-24 02:33:38
车型 年份 月份 数量
suv 2003 6月 0
suv 2003 7月 1
suv 2003 8月 0
suv 2003 9月 3
suv 2003 10月 0
suv 2003 11月 1
suv 2003 12月 2
ft 2003 6月 1
ft 2003 7月 0
ft 2003 8月 0
ft 2003 9月 1
ft 2003 10月 2
ft 2003 11月 3
ft 2003 12月 0
asd 2004 1月 2
asd 2004 2月 1
asd 2004 3月 0

查出记录为2003的的8月至2004年的2月的记录,查出以后怎么显示成下面的表

车型 8月 9月 10月 11月 12月 1月 2月
suv 0 3 0 1 2 0 0
ft 0 1 2 3 0 0 0
asd 0 0 0 0 0 2 1
...全文
167 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rfq 2012-09-26
  • 打赏
  • 举报
回复
现在 2005 和 2008 pivot 很好用
但是不灵活
湖人 2012-09-25
  • 打赏
  • 举报
回复
select
车型,
sum(case when 年份=2003 and 月份=8 then 数量 else 0 end) as 8月,
sum(case when 年份=2003 and 月份=9 then 数量 else 0 end) as 8月,
.........---自己照着写
from
tb
group by
车型
發糞塗牆 2012-09-24
  • 打赏
  • 举报
回复
我第二次发的不行吗?
b283992238 2012-09-24
  • 打赏
  • 举报
回复
消息 245,级别 16,状态 1,过程 a,第 17 行
在将 varchar 值 ']' 转换成数据类型 int 时失败。
--小F-- 2012-09-24
  • 打赏
  • 举报
回复
你这个日期设置得很不好 要么在一起 分开了你自己去拼接吧。
--小F-- 2012-09-24
  • 打赏
  • 举报
回复
if OBJECT_ID('test') is not null
drop proc test
go
create proc test
(
@year1 int,
@month1 int,
@year2 int,
@month2 int
)
as
declare @sql varchar(8000)
set @sql = 'select 车型 '
select @sql = @sql + ' , max(case when 年份=''' + ltrim(年份) + ''' and 月份=''' + ltrim(月份) + ''' then 数量 else 0 end) [' + 月份 + ']'
from (select distinct 年份,月份 from tb) as a
set @sql = @sql + ' from tb group by 车型'
exec(@sql)
go
exec test '','','',''
發糞塗牆 2012-09-24
  • 打赏
  • 举报
回复
CREATE TABLE test (车型 VARCHAR(10), 年份 VARCHAR(10),月份 VARCHAR(10),数量 INT )
INSERT INTO test

SELECT 'suv', '2003', '6月', 0
UNION ALL
SELECT 'suv', '2003', '7月', 1
UNION ALL
SELECT 'suv', '2003', '8月', 0
UNION ALL
SELECT 'suv', '2003', '9月', 3
UNION ALL
SELECT 'suv', '2003', '10月', 0
UNION ALL
SELECT 'suv', '2003', '11月', 1
UNION ALL
SELECT 'suv', '2003', '12月', 2
UNION ALL
SELECT 'ft', '2003', '6月', 1
UNION ALL
SELECT 'ft', '2003', '7月', 0
UNION ALL
SELECT 'ft', '2003', '8月', 0
UNION ALL
SELECT 'ft', '2003', '9月', 1
UNION ALL
SELECT 'ft', '2003', '10月', 2
UNION ALL
SELECT 'ft', '2003', '11月', 3
UNION ALL
SELECT 'ft', '2003', '12月', 0
UNION ALL
SELECT 'asd', '2004','1月', 2
UNION ALL
SELECT 'asd', '2004', '2月', 1
UNION ALL
SELECT 'asd', '2004', '3月', 0



SELECT 车型,SUBSTRING(年份+CASE WHEN LEN(SUBSTRING(月份,1,CHARINDEX('月',月份,1)))=2 THEN '0'+月份 ELSE 月份 END,
1,LEN(年份+CASE WHEN LEN(SUBSTRING(月份,1,CHARINDEX('月',月份,1)))=2 THEN '0'+月份 ELSE 月份 END)-1) 月份,数量 INTO #t
FROM test



declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename(SUBSTRING(月份,5,2))+'=max(case when [月份]='+quotename(月份,'''')+' then [数量] else 0 end)'
from #t WHERE 月份 BETWEEN '200308' AND '200402' group BY 月份
exec('select [车型]'+@s+' from #t group by [车型]')

/*
车型 08 09 10 11 12 01 02
---------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
asd 0 0 0 0 0 2 1
ft 0 1 2 3 0 0 0
suv 0 3 0 1 2 0 0

(3 行受影响)

*/
發糞塗牆 2012-09-24
  • 打赏
  • 举报
回复
月份那里你自己改一下吧,上班没太多时间
--CREATE TABLE test (车型 VARCHAR(10), 年份 VARCHAR(10),月份 VARCHAR(10),数量 INT )
--INSERT INTO test

--SELECT 'suv', '2003', '6月', 0
--UNION ALL
--SELECT 'suv', '2003', '7月', 1
--UNION ALL
--SELECT 'suv', '2003', '8月', 0
--UNION ALL
--SELECT 'suv', '2003', '9月', 3
--UNION ALL
--SELECT 'suv', '2003', '10月', 0
--UNION ALL
--SELECT 'suv', '2003', '11月', 1
--UNION ALL
--SELECT 'suv', '2003', '12月', 2
--UNION ALL
--SELECT 'ft', '2003', '6月', 1
--UNION ALL
--SELECT 'ft', '2003', '7月', 0
--UNION ALL
--SELECT 'ft', '2003', '8月', 0
--UNION ALL
--SELECT 'ft', '2003', '9月', 1
--UNION ALL
--SELECT 'ft', '2003', '10月', 2
--UNION ALL
--SELECT 'ft', '2003', '11月', 3
--UNION ALL
--SELECT 'ft', '2003', '12月', 0
--UNION ALL
--SELECT 'asd', '2004','1月', 2
--UNION ALL
--SELECT 'asd', '2004', '2月', 1
--UNION ALL
--SELECT 'asd', '2004', '3月', 0

--SELECT * FROM test

SELECT 车型,SUBSTRING(年份+CASE WHEN LEN(SUBSTRING(月份,1,CHARINDEX('月',月份,1)))=2 THEN '0'+月份 ELSE 月份 END,
1,LEN(年份+CASE WHEN LEN(SUBSTRING(月份,1,CHARINDEX('月',月份,1)))=2 THEN '0'+月份 ELSE 月份 END)-1) 月份,数量 INTO #t
FROM test


declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename(月份)+'=max(case when [月份]='+quotename(月份,'''')+' then [数量] else 0 end)'
from #t group BY 月份
exec('select [车型]'+@s+' from #t group by [车型]')

/*
车型 200306 200307 200308 200309 200310 200311 200312 200401 200402 200403
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
asd 0 0 0 0 0 0 0 2 1 0
ft 1 0 0 1 2 3 0 0 0 0
suv 0 1 0 3 0 1 2 0 0 0

(3 行受影响)

*/
b283992238 2012-09-24
  • 打赏
  • 举报
回复
怎么写 怎么写 - -
b283992238 2012-09-24
  • 打赏
  • 举报
回复
我是想写一个存储过程 里面有两个参数 开始的时间和结束时间

把第一个表里包括在这个时间段里的记录都查出来 是动态的 显示成第二个表的样式

caoyang0299 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
SQL code

select
车型,
sum(case when 年份=2003 and 月份=8 then 数量 else 0 end) as 8月,
sum(case when 年份=2003 and 月份=9 then 数量 else 0 end) as 8月,
.........---自己照着写
from
tb
group by
车型
[/Quote]
呵呵,年份不需要就把年份干掉
--小F-- 2012-09-24
  • 打赏
  • 举报
回复
select
车型,
sum(case when 年份=2003 and 月份=8 then 数量 else 0 end) as 8月,
sum(case when 年份=2003 and 月份=9 then 数量 else 0 end) as 8月,
.........---自己照着写
from
tb
group by
车型

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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