線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2520
推到 Plurk!
推到 Facebook!

SQL語法 生產資料整合

答題得分者是:P.D.
班別早班早班晚班早班晚班晚班早班晚班
monkeyhung
一般會員


發表:51
回覆:55
積分:21
註冊:2006-12-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-01-18 16:25:12 IP:59.125.xxx.xxx 訂閱
日期 A 10
1/1 C 30
1/1 B 30
1/1 A 15
1/2 D 30
1/2 C 20
1/2 B 30
1/3 D 25
1/3 B 20

料號 1/1 1/3 A 10 0 晚班 0 10 30 B 20 30 晚班 20 50 50 C 30 15 晚班 20 70 15 D 20 25 晚班 10 20 25
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-01-18 18:37:37 IP:118.169.xxx.xxx 未訂閱
依整合後的資料表來看
SELECT 料號, 班別, 日期, SUM(數量) FORM 資料表
GROUP BY 料號, 班別, 日期
可以統計出每一單筆按料號 班別 日期的小計
至於你要的每日小計, 可能要使用到 UNION 來做, 如果嫌麻煩
不妨用STRINGGRID 方式把上表求得的數值, 一個蘿蔔一個坑的填入,
再來小計的部份就用迴圈計算結果再放在你要的GRID表格中

或者另一個方法
把上表統計結果再丟到一個暫存表(經過小計等計算的), 然後利用最後這張暫存表給展現出來(可用DBGRID, STRINGGRID等)
===================引 用 monkeyhung 文 章===================
班別日期A10早班1/1C30早班1/1B30晚班1/1A15早班1/2D30晚班1/2C20晚班1/2B30早班1/3D25晚班1/3B20
料號1/11/3A100晚班01030B2030晚班205050C3015晚班207015D2025晚班102025
monkeyhung
一般會員


發表:51
回覆:55
積分:21
註冊:2006-12-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-01-18 18:52:42 IP:59.125.xxx.xxx 訂閱
謝謝大大的回應
小弟下午也是採用和大大的說法一樣
利用union all的方式來做
首先把生產資料班別匯總union all 每日匯總後
再把得出的結果利用PIVOT的方式把資料轉成橫向
這樣就能得出所要的結果了^__^
===================引 用 P.D. 文 章===================
依整合後的資料表來看
SELECT 料號, 班別, 日期, SUM(數量) FORM 資料表
GROUP BY 料號, 班別, 日期
可以統計出每一單筆按料號 班別 日期的小計
至於你要的每日小計, 可能要使用到 UNION 來做, 如果嫌麻煩
不妨用STRINGGRID 方式把上表求得的數值, 一個蘿蔔一個坑的填入,
再來小計的部份就用迴圈計算結果再放在你要的GRID表格中

或者另一個方法
把上表統計結果再丟到一個暫存表(經過小計等計算的), 然後利用最後這張暫存表給展現出來(可用DBGRID, STRINGGRID等)
===================引 用 monkeyhung 文 章===================
班別日期A10早班1/1C30早班1/1B30晚班1/1A15早班1/2D30晚班1/2C20晚班1/2B30早班1/3D25晚班1/3B20
料號1/11/3A100晚班01030B2030晚班205050C3015晚班207015D2025晚班102025
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-01-18 22:21:57 IP:118.169.xxx.xxx 未訂閱
如果你願意的話, 可否分享你的設定內容, 謝謝!
大武士
一般會員


發表:3
回覆:11
積分:7
註冊:2010-09-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-01-24 13:53:05 IP:60.249.xxx.xxx 訂閱
^ ^! 可否分享內容??.....
謝謝前輩!!
===================引 用 monkeyhung 文 章===================
謝謝大大的回應
小弟下午也是採用和大大的說法一樣
利用union all的方式來做
首先把生產資料班別匯總union all 每日匯總後
再把得出的結果利用PIVOT的方式把資料轉成橫向
這樣就能得出所要的結果了^__^
===================引 用 P.D. 文 章===================
依整合後的資料表來看
SELECT 料號, 班別, 日期, SUM(數量) FORM 資料表
GROUP BY 料號, 班別, 日期
可以統計出每一單筆按料號 班別 日期的小計
至於你要的每日小計, 可能要使用到 UNION 來做, 如果嫌麻煩
不妨用STRINGGRID 方式把上表求得的數值, 一個蘿蔔一個坑的填入,
再來小計的部份就用迴圈計算結果再放在你要的GRID表格中

或者另一個方法
把上表統計結果再丟到一個暫存表(經過小計等計算的), 然後利用最後這張暫存表給展現出來(可用DBGRID, STRINGGRID等)
===================引 用 monkeyhung 文 章===================
班別日期A10早班1/1C30早班1/1B30晚班1/1A15早班1/2D30晚班1/2C20晚班1/2B30早班1/3D25晚班1/3B20
料號1/11/3A100晚班01030B2030晚班205050C3015晚班207015D2025晚班102025
monkeyhung
一般會員


發表:51
回覆:55
積分:21
註冊:2006-12-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-01-26 17:33:17 IP:59.125.xxx.xxx 訂閱

[code delphi]
procedure TFPRDS20._GetProdDay; var xSQL:String; xCount:Integer; begin xCount:=0; xProdD:=''; xSQLFName:=''; try DM1.ADOCommand_UpdateSQL.CommandText:=' if (select OBJECT_ID(''tempdb..#Temp_ProdDay'')) IS NOT NULL Drop Table #Temp_ProdDay ' ' select convert(varchar(11),dateadd(dd,number,' QuotedStr(Query_Search.FieldByName('ProdDayS').AsString) '),112) as ProdDay ' ' into #Temp_ProdDay ' ' from master..spt_values ' ' where type=''p'' and ' ' number < datediff(dd,' QuotedStr(Query_Search.FieldByName('ProdDayS').AsString) ',' QuotedStr(Query_Search.FieldByName('ProdDayE').AsString) ') 1'; DM1.ADOCommand_UpdateSQL.Execute; xSQL:=' select ProdDay,''D_'' Convert(varchar(11),(ProdDay),112) as TrProdDay from #Temp_ProdDay '; DM1._Query_table(DM1.Qtmp,xSQL); if not DM1.Qtmp.IsEmpty then begin DM1.Qtmp.First; While not DM1.Qtmp.Eof do begin xCount:=xCount 1; Case xCount of 1:begin xProdD :=('[' DM1.Qtmp.FieldByName('TrProdDay').AsString ']'); xSQLFName:='isnull(D.[' DM1.Qtmp.FieldByName('TrProdDay').AsString '],' '0' ') as ''' DM1.Qtmp.FieldByName('ProdDay').AsString ''''; xSubFName:='isnull(D.[' DM1.Qtmp.FieldByName('TrProdDay').AsString '],' '0' ') '; end else begin xProdD :=xProdD ',' ('[' DM1.Qtmp.FieldByName('TrProdDay').AsString ']'); xSQLFName:=xSQLFName ',' 'isnull(D.[' DM1.Qtmp.FieldByName('TrProdDay').AsString '],' '0' ') as ''' DM1.Qtmp.FieldByName('ProdDay').AsString ''''; xSubFName:=xSubFName ' ' 'isnull(D.[' DM1.Qtmp.FieldByName('TrProdDay').AsString '],' '0' ') '; end; end; DM1.Qtmp.Next; end; end else begin FunU._ShowMes('捉取不到生產天數 '); Abort; end; except FunU._ShowMes('匯整生產天數失敗,請再重新查詢一次。 '); Abort; end; end; procedure TFPRDS20.Query_SearchAfterScroll(DataSet: TDataSet); var xSQL:String; i:integer; xProdNo:String; begin inherited; if DBGrid_D.Hint = 'UnCheck' then Exit; if Query_Search.FieldByName('IsDelete').AsString='1' then Exit; //**先串起所需天數的語法 _GetProdDay; //**刪除已建立欄位 while DBGrid_D.Columns.Count > 8 do DBGrid_D.Columns.Delete(DBGrid_D.Columns.Count-1); try FPRDS20.Enabled := False; Query_D.DisableControls; try DM1.ADOConnection_InnovaDB.BeginTrans; xSQL:='-- 先crate一個早、晚班、小計的暫存表 ' #13 ' if (select OBJECT_ID(''tempdb..#Temp_DS'')) IS NOT NULL Drop Table #Temp_DS ' #13 ' CREATE TABLE #Temp_DS( [ShiftT] [nVarchar](6) NOT NULL, ' #13 ' [ShiftTNa] [nVarchar](6) NOT NULL ) ' #13 ' insert into #Temp_DS values(''D'',' QuotedStr(A2UToBIG5(ChangeStr('早班'))) ') ' #13 ' insert into #Temp_DS values(''S'',' QuotedStr(A2UToBIG5(ChangeStr('晚班'))) ') ' #13 ' insert into #Temp_DS values(''SumDay'',' QuotedStr(A2UToBIG5(ChangeStr('小計'))) ') ' #13 #13 ' --先匯整早、晚班RM、RD資料利用union all的方式把小計納進來 ' #13 ' if (select OBJECT_ID(''tempdb..#PRD_SumPQty'')) IS NOT NULL Drop Table #PRD_SumPQty ' #13 ' select M.CorpNo,M.ShiftT,D.MPSPCTNo,D.ProdNo, ' #13 ' ''D_'' Convert(varchar(11),(M.ProduceD),112) as ProduceD,SUM(D.PQty-D.TotBQty) as PQty ' #13 ' into #PRD_SumPQty ' #13 ' from RM M,RD D ' #13 ' where M.CorpNo=D.CorpNo ' #13 ' and M.CHNo=D.CHNo ' #13 ' and M.IsDelete<>''1'' ' #13 ' and M.CorpNo=' QuotedStr(Query_Search.fieldByName('CorpNo').AsString) #13 ' and M.PType=' QuotedStr(LeftStr(ComboBox_PType.Text,1)) #13 ' and isnull(D.MPSPCTNo,'''')=' QuotedStr(Query_Search.fieldByName('PCTNo').AsString) #13 ' group by M.CorpNo,M.ShiftT,D.MPSPCTNo,D.ProdNo,M.ProduceD ' #13 ' union all ' #13 ' select M.CorpNo,''SumDay'' as ShiftT,D.MPSPCTNo,D.ProdNo, ' #13 ' ''D_'' Convert(varchar(11),(M.ProduceD),112) as ProduceD,SUM(D.PQty-D.TotBQty) as PQty ' #13 ' from RM M,RD D ' #13 ' where M.CorpNo=D.CorpNo ' #13 ' and M.CHNo=D.CHNo ' #13 ' and M.IsDelete<>''1'' ' #13 ' and M.CorpNo=' QuotedStr(Query_Search.fieldByName('CorpNo').AsString) #13 ' and M.PType=' QuotedStr(LeftStr(ComboBox_PType.Text,1)) #13 ' and isnull(D.MPSPCTNo,'''')=' QuotedStr(Query_Search.fieldByName('PCTNo').AsString) #13 ' group by M.CorpNo,D.MPSPCTNo,D.ProdNo,M.ProduceD ' #13 #13 ' --先把班別表和生產數做結合 ' #13 ' if (select OBJECT_ID(''tempdb..#PRD_ShiftT'')) IS NOT NULL Drop Table #PRD_ShiftT ' #13 ' select DS.*,M.CorpNo,M.MPSPCTNo,M.ProdNo,M.ProduceD ' #13 ' into #PRD_ShiftT ' #13 ' from #Temp_DS DS,(select CorpNo,MPSPCTNo,ProdNo,ProduceD from #PRD_SumPQty ' #13 ' group by CorpNo,MPSPCTNo,ProdNo,ProduceD) M ' #13 ' order by M.ProduceD,M.ProdNo,DS.ShiftT ' #13 #13 ' --結合 ' #13 ' if (select OBJECT_ID(''tempdb..#PRD_TD'')) IS NOT NULL Drop Table #PRD_TD ' #13 ' select ST.*,isnull(DSum.PQty,''0'') as DSumQty ' #13 ' into #PRD_TD ' #13 ' from #PRD_ShiftT ST ' #13 ' left join #PRD_SumPQty DSum on ST.ShiftT COLLATE Chinese_PRC_Stroke_CI_AS=DSum.ShiftT COLLATE Chinese_PRC_Stroke_CI_AS and ' #13 ' ST.CorpNo COLLATE Chinese_PRC_Stroke_CI_AS=DSum.CorpNo COLLATE Chinese_PRC_Stroke_CI_AS and ' #13 ' ST.MPSPCTNo COLLATE Chinese_PRC_Stroke_CI_AS=DSum.MPSPCTNo COLLATE Chinese_PRC_Stroke_CI_AS and ' #13 ' ST.ProdNo COLLATE Chinese_PRC_Stroke_CI_AS=DSum.ProdNo COLLATE Chinese_PRC_Stroke_CI_AS and ' #13 ' ST.ProduceD COLLATE Chinese_PRC_Stroke_CI_AS=DSum.ProduceD COLLATE Chinese_PRC_Stroke_CI_AS ' #13 #13 ' --將匯整出來的資料轉成橫向 ' #13 ' if (select OBJECT_ID(''tempdb..#PRD_PIVOTQty'')) IS NOT NULL Drop Table #PRD_PIVOTQty ' #13 ' select * into #PRD_PIVOTQty ' #13 ' from (select * from #PRD_TD) as xx ' #13 ' PIVOT ' #13 ' (sum(DSumQty) ' #13 ' for ProduceD ' #13 ' in( ' xProdD ' )) as xxx '; //FunU._WriteWideString2File(FunU._GetDesktopDir 'FPRDS20_1.txt',xSQL); DM1.ADOCommand_UpdateSQL.CommandText :=xSQL; DM1.ADOCommand_UpdateSQL.Execute; DM1.ADOConnection_InnovaDB.CommitTrans; except DM1.ADOConnection_InnovaDB.RollbackTrans; FunU._ShowMes(' 資料匯總錯誤,請再重試一次'); Abort; end; //**try except Finally //**--將生產數最終結果與生產管制表結合 DM1.SQL_Command:=' if (select OBJECT_ID(''tempdb..#PRD_Finaly'')) IS NOT NULL Drop Table #PRD_Finaly ' #13 ' select M.PCTNo,M.ProdNo,P.PnameD ' #13 ' ,Convert(varchar(10),M.DNeedQty) as DNeedQty,Convert(varchar(10),isnull(M.BondedQty,0)) as BondedQty ' #13 ' ,ISNULL(M.CusNa,'''') as CusNa,ISNULL(M.Rem,'''') as Rem,isnull(M.ShipRem,'''') as ShipRem,isnull(D.ShiftTNa,'''') as ShiftT,' xSQLFName #13 ' ,( ' xSubFName ' ) as SumPQty ' #13 ' into #PRD_Finaly ' #13 ' from PCTD M ' #13 ' left join #PRD_PIVOTQty D on M.CorpNo=D.CorpNo and M.PCTNo=D.MPSPCTNo and M.ProdNo=D.ProdNo ' #13 ' ,Prod P ' #13 ' where M.ProdNo=P.ProdNo ' #13 ' and M.PCTNo=' QuotedStr(Query_Search.fieldByName('PCTNo').AsString) #13 ' order by M.ProdNo'; //FunU._WriteWideString2File(FunU._GetDesktopDir 'FPRDS20_2.txt',DM1.SQL_Command); DM1.ADOCommand_UpdateSQL.CommandText:=DM1.SQL_Command; DM1.ADOCommand_UpdateSQL.Execute; DM1.SQL_Command:='select * from #PRD_Finaly order by ProdNo '; DM1._Query_table(Query_D,DM1.SQL_Command); //**設定DBGrid_D顯示格 式 for i:=0 to Query_D.FieldCount-1 do begin if ( (Query_D.Fields[i].FieldName = 'PCTNo') or (Query_D.Fields[i].FieldName = 'ProdNo') or (Query_D.Fields[i].FieldName = 'PnameD') or (Query_D.Fields[i].FieldName = 'DNeedQty') or (Query_D.Fields[i].FieldName = 'BondedQty') or (Query_D.Fields[i].FieldName = 'CusNa') or (Query_D.Fields[i].FieldName = 'Rem') or (Query_D.Fields[i].FieldName = 'ShipRem') or (Query_D.Fields[i].FieldName = 'ShiftT') ) then Continue; DBGrid_D.Columns.Add; DBGrid_D.Columns[DBGrid_D.Columns.Count-1].FieldName := Query_D.Fields[i].FieldName; if Query_D.Fields[i].FieldName = 'SumPQty' then DBGrid_D.Columns[DBGrid_D.Columns.Count-1].Title.Caption := ChangeStr('合計 ') else DBGrid_D.Columns[DBGrid_D.Columns.Count-1].Title.Caption := Query_D.Fields[i].FieldName; end; //**設定DBGrid_D 欄位顯示否 xProdNo:=''; Query_D.First; While not Query_D.Eof do begin if xProdNo=Query_D.FieldByName('ProdNo').AsString then begin Query_D.Edit; Query_D.FieldByName('ProdNo').AsString:=' '; Query_D.FieldByName('PnameD').AsString:=' '; Query_D.FieldByName('DNeedQty').AsString:=' '; Query_D.FieldByName('BondedQty').AsString:=' '; Query_D.FieldByName('CusNa').AsString:=' '; Query_D.FieldByName('Rem').AsString:=' '; Query_D.FieldByName('ShipRem').AsString:=' '; end else xProdNo:=Query_D.FieldByName('ProdNo').AsString; Query_D.Next; end; Query_D.First; Query_D.EnableControls; FPRDS20.Enabled := True; end; //**try Finally end;
[/code]
各位大大 小弟把這一段的程式碼貼出來供各位大大參考 小弟用的方法很笨,請各位大大不要見笑^^ 程式碼太亂的話,請見諒!!!!
編輯記錄
monkeyhung 重新編輯於 2011-01-26 02:34:19, 註解 無‧
系統時間:2024-04-27 2:27:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!