求:解决数据库交叉表的问题

mkb21 2008-05-29 11:07:49
一个SQL查询统计问题,急求答案!
表1[Sale]
字段1:ID (唯一序号)
字段2:ProdID (产品ID)
字段3:SpecId (规格ID)
字段4:Scalar (数量)
字段5:TDate (日期yyyy-mm-dd格式)

数据:
ID ProdId SpecId Scalar TDate
1 1 1 12 2008-1-2
2 1 2 31 2008-1-5
3 1 3 42 2008-1-10
4 2 1 76 2008-1-12
5 2 2 34 2008-1-14
6 2 3 56 2008-1-16
7 3 1 32 2008-1-18
8 3 2 78 2008-1-22
9 3 3 12 2008-1-28
10 1 1 54 2008-2-2
11 1 2 34 2008-2-4
12 1 3 0 2008-2-7
13 2 1 4 2008-2-9
14 2 2 8 2008-2-12
15 2 3 15 2008-2-15
16 3 1 18 2008-2-18
19 3 2 22 2008-2-22
20 3 3 31 2008-2-24
... ...

表2[Product]
字段1:ID(唯一序号)
字段2:ProdName(产品名称)

数据:
ID ProdName
1 产品A
2 产品B
3 产品C

表3[Specif]
字段1:ID(唯一序号)
字段2:SpecName(规格名称)

数据:
ID SpecName
1 规格a
2 规格b
3 规格c


能对应不同产品的不同规格统计出每个月份的数字出来,做出来的表应该反映为:

产品名 规格 年份 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
-----------------------------------------------------------------------------------------------------
产品A 规格a 2008 20 59 70 120 163 189 200 233 258 300 310 350
产品A 规格b 2008 18 34 67 114 159 234 267 282 329 368 420 456
产品A 规格c ... ...
产品B 规格a ... ...
产品B 规格b ... ...
产品B 规格c ... ...
产品C 规格a ... ...
产品C 规格b ... ...
产品C 规格c ... ...
-----------------------------------------------------------------------------------------------------
各产品不同规格的数字均为当月份多个记录的合计数,其中部分当月记录为Null,此时应该显示为0。
请哪位高手给予指教,谢谢

我自己用交叉表查询的语句是:

select
Product as 产品,
Specif as 规格,
year(TDate) as 年份,
sum(case month(TDate) when 1 then Scalar end) as [1月],
sum(case month(TDate) when 2 then Scalar end) as [2月],
sum(case month(TDate) when 3 then Scalar end) as [3月],
sum(case month(TDate) when 4 then Scalar end) as [4月],
... ...
... ...
FROM dbo.Sale INNER JOIN
dbo.Product ON dbo.Sale.ProdId = dbo.Product.id INNER JOIN
dbo.Specif ON dbo.Sale.SpecId = dbo.Specif.id
GROUP BY dbo.Sale.id, dbo.Product.Product, dbo.Specif.Specif, dbo.Sale.Scalar,
dbo.Sale.TDate

结果是这样的:

产品 规格 年份 1月 2月 3月 4月 ... ...
------------------------------------------------------- ... ...
产品A 规格A 2008 12 NULL NULL NULL ... ...
产品A 规格B 2008 31 NULL NULL NULL
产品A 规格C 2008 42 NULL NULL NULL
产品B 规格A 2008 76 NULL NULL NULL
产品B 规格B 2008 34 NULL NULL NULL
产品B 规格C 2008 56 NULL NULL NULL
产品C 规格A 2008 32 NULL NULL NULL
产品C 规格B 2008 78 NULL NULL NULL
产品C 规格C 2008 12 NULL NULL NULL
产品A 规格A 2008 NULL 54 NULL NULL
产品A 规格B 2008 NULL 34 NULL NULL
产品A 规格C 2008 NULL 0 NULL NULL
产品B 规格A 2008 NULL 4 NULL NULL
产品B 规格B 2008 NULL 8 NULL NULL
产品B 规格C 2008 NULL 15 NULL NULL
产品C 规格A 2008 NULL 18 NULL NULL
产品C 规格B 2008 NULL 22 NULL NULL
产品C 规格C 2008 NULL 31 NULL NULL
产品A 规格A 2008 NULL NULL 13 NULL
产品A 规格B 2008 NULL NULL 23 NULL
产品A 规格C 2008 NULL NULL 34 NULL
产品B 规格A 2008 NULL NULL 45 NULL
产品B 规格B 2008 NULL NULL 21 NULL
产品B 规格C 2008 NULL NULL 22 NULL
产品C 规格A 2008 NULL NULL 56 NULL
产品C 规格B 2008 NULL NULL 34 NULL
产品C 规格C 2008 NULL NULL 89 NULL
产品A 规格A 2008 NULL NULL NULL 54
产品A 规格B 2008 NULL NULL NULL 33
产品A 规格C 2008 NULL NULL NULL 91
产品B 规格A 2008 NULL NULL NULL 81
产品B 规格B 2008 NULL NULL NULL 66
产品B 规格C 2008 NULL NULL NULL 43
产品C 规格A 2008 NULL NULL NULL 72
产品C 规格B 2008 NULL NULL NULL 85
产品C 规格C 2008 NULL NULL NULL 66
... ...
... ...
--------------------------------------------------------------- ... ...

全年12个月的记录本来用9行就可以显示了,可现在要用几十行来显示,为什么产品A和规格a的记录在不同的月份不会显示在同一行呢?
问题出在哪里,请指教!谢谢

附:数据表建立代码

CREATE TABLE [Product] (
[id] [int] NOT NULL ,
[Product] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO


CREATE TABLE [Sale] (
[id] [int] NOT NULL ,
[ProdId] [int] NOT NULL ,
[SpecId] [int] NOT NULL ,
[Scalar] [numeric](18, 0) NOT NULL ,
[TDate] [smalldatetime] NOT NULL ,
CONSTRAINT [PK_Sale] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO


CREATE TABLE [Specif] (
[id] [int] NOT NULL ,
[Specif] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_Specif] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO
...全文
122 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mkb21 2008-05-29
  • 打赏
  • 举报
回复
还是不行,和以前一样!
Limpire 2008-05-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mkb21 的回复:]
这么快就回复了,你真行!
[/Quote]

GROUP BY dbo.Sale.id, dbo.Product.Product, dbo.Specif.Specif, dbo.Sale.Scalar, year(TDate)
mkb21 2008-05-29
  • 打赏
  • 举报
回复
这么快就回复了,你真行!
mkb21 2008-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Limpire 的回复:]
不能对dbo.Sale.TDate进行group by,叉掉。
[/Quote]
这样处理后,报错:
'dbo.Sale.TDate' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
Limpire 2008-05-29
  • 打赏
  • 举报
回复
不能对dbo.Sale.TDate进行group by,叉掉。
Limpire 2008-05-29
  • 打赏
  • 举报
回复
GROUP BY dbo.Sale.id, dbo.Product.Product, dbo.Specif.Specif, dbo.Sale.Scalar,
dbo.Sale.TDate X
------------------------

GROUP BY dbo.Sale.id, dbo.Product.Product, dbo.Specif.Specif, dbo.Sale.Scalar

34,873

社区成员

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

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