看板 Database 關於我們 聯絡資訊
請慢用 ====================================================== 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
grence:http://0rz.tw/y8WUA 04/23 19:53