作者evernever (NeverEver)
看板Database
标题Re: [SQL ] 请教语法的撰写..
时间Thu Apr 23 12:17:46 2009
请慢用
======================================================
Declare @GTypeID int, @From DateTime, @To DateTime
Set @GTypeID = 1
Set @From = '2009/Apr/20'
Set @To= '2009/Apr/22'
;with List(Date) as
(
Select @From
Union ALL
Select dateadd(dd,1,Date) From List Where Date < @To
)
Select GTypeName, l.Date, isnull(Cnt,0) Cnt
From List l
left join (Select GTypeID , IODate, Sum(IOCnt) Cnt
From Glist
Where GTypeID = @GTypeID
Group By GTypeID , IODate) V on l.Date = V.IODate
left join GType on isnull(V.GTypeID, @GtypeID) = GType.GTypeID
======================================================
备注: 假如日期相差一百天以上, SQL 2008 会出错
GList.IsUp = 1 应该要考虑进去 GList.GId = 5 是无效的...
※ 引述《mywheat (麦田)》之铭言:
: 资料库: MS SQL 2008 Express
: OS : windows XP
: 我有二个表格,分别为 GList, GType
: [GList 栏位]
: GId int '(key)
: GTypeId int ' 货物的 id
: IoDate Date ' 进出日期
: IoCnt Int ' 进出量
: IsUp Bit ' 是否有效, 1 为有效
: 资料:
: GId GTypeId IoDate IoCnt IsUp
: 1 1 2009/4/20 14 1
: 2 2 2009/4/20 5 1
: 3 3 2009/4/20 6 1
: 4 1 2009/4/20 -4 1
: 5 1 2009/4/21 -1 0
: 6 3 2009/4/22 2 1
: 7 2 2009/4/23 3 1
: 8 1 2009/4/23 4 1
: [GType 栏位]
: GTypeId int ' 货物的id (key)
: GTypeName nvarchar ' 货物名称
: 资料:
: GTypeId GTypeName
: 1 AAAA
: 2 BBBB
: 3 CCCC
: 我想要查输入货物id与日期范围,就可以列出这货物这些天的每天进出小计表,
: 也必须是有效资料。另外,如果在日期范围内没有进出,也要列 0
: 如, 输入GTypeId = 1, 日期(IoDate)范围 between 2009/4/20 and 2009/4/22
: 列出来资料应该是这样
: 名称 日期 进出
: AAA 2009/4/20 10
: AAA 2009/4/21 -1
: AAA 2009/4/22 0
: 请教各位前辈,这样的语法该怎麽写呢?
: 我写到这样,想不出该怎麽写了,特别是那每天列出的部分
: SELECT SUM(GList.IoCnt) AS cnt, GList.IoDate, GType.GTypeName
: FROM GList
: INNER JOIN GType ON GList.GTypeId = GType.GTypeId
: WHERE (GList.GId = 1) AND
: (GList.IoDate >= '2009/4/20') AND (GList.IoDate <= '2009/4/22')
: GROUP BY GList.IoDate, GType.GTypeName
: ORDER BY GList.IoDate
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.88.112.42
※ 编辑: evernever 来自: 61.88.112.42 (04/23 12:23)
1F:推 mywheat:感谢,晚点来试试.. 天数倒不用在意,最多 7 天而已 ^^ 04/23 14:11
2F:推 grence:可用 OPTION (MAXRECURSION N)改变CTE预设的递回次数(100) 04/23 19:45