作者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)
推 mywheat:感謝,晚點來試試.. 天數倒不用在意,最多 7 天而已 ^^ 04/23 14:11
推 grence:可用 OPTION (MAXRECURSION N)改變CTE預設的遞迴次數(100) 04/23 19:45