要對sql查詢結果進行計算,並要改變結果中的值,怎樣直接利用sql查詢結果而不是放到虛擬表中運算,請大家幫忙


在數據庫中有訂單欠數表ddqsb,和產品結存表cpjcb
ddqsb 中有 訂單號 產品名稱 欠數字段
cpjcb 中有 產品名稱 結存字段
目的通過兩個表連接,將結存根據欠數分攤到訂單上去
select a.訂單號,a.產品名稱,a.欠數,b.結存, 0 AS 利用數 from ddqsb a left join cpjcb b on a.產品名稱=b.產品名稱
結果如下
訂單號 產品名稱 欠數 結存  利用數
  101   G90 15   10   20    0
  102   G90 15   5    20    0
  103   G90 15   5    20    0
  101   B90 10   10   30    0
  102   B90 10   15   30    0
想把結果轉化為 
訂單號 產品名稱 欠數 結存  利用數
  101   G90 15   10   20    10
  102   G90 15   5    20    5
  103   G90 15   5    20    5
  101   B90 10   10   30    10
  102   B90 10   15   30    15
我是放在虛擬表中循環實現的 但是實際數據為幾萬條,每個人查都要形成這么一個虛擬表,
對服務器影響太大,請問有沒有方法將數據先存到查詢機上,再循環實現
 



7 个解决方案

#1


利用數是怎么得出來的?

#2


利用數跟欠數一樣嗎???
如果一樣
update tablename set 利用數=欠數

#3


g90 15的產品一共有20個,目的是滿足欠數,利用數是根據欠數和結存數算出的 G90 15 共有20件,根據訂單欠數分攤到各訂單上,101訂單上G90 15 欠10,利用10個,剩下10 繼續分攤到102訂單上G90 15 的欠數5個上,又剩五個,依次類推 ,當剩余結存當總結存使用完之后,利用數為0,當欠數大於剩余結存數時,利用數為剩余結存數,當欠數小於剩余結存數時,利用數為訂單欠數

#4


參照一下下面的算法,更一下就可以實現你的要求了(摘自zjcxc鄒建的作品中):
-- 先進先出的數據沖銷處理 :
-- 示例數據
-- CREATE TABLE 銷售訂單(單號 VARCHAR(10),日期 DATETIME,貨品編碼 VARCHAR(10),數量 INT)
-- INSERT 銷售訂單 
-- SELECT 'A1','2005-5-1','ABCD',100 UNION ALL
-- SELECT 'A2','2005-5-3','ABCD',200 UNION ALL
-- SELECT 'A3','2005-5-4','ABCD',300 UNION ALL
-- SELECT 'A4','2005-5-8','ABCD',500
-- 
-- CREATE TABLE 銷售發貨單(單號 VARCHAR(10),日期 DATETIME,貨品編碼 VARCHAR(10),數量 INT)
-- INSERT 銷售發貨單
-- SELECT 'B1','2005-5-05','ABCD',250 UNION ALL
-- SELECT 'B2','2005-5-07','ABCD',100 UNION ALL
-- SELECT 'B3','2005-5-10','ABCD',150'
-- GO
-- 
-- 問題描述:
--     對於示例數據中的銷售訂單和銷售發貨單,由於客戶在做銷售發貨時無法指定本次是要發那一張訂單的東西。
-- 所以銷售訂單無法與銷售發貨單關聯。客戶要求以先進先出的方式統計銷售訂單的執行情況。對於示例數據,要求結果如下:
-- 單號        日期             貨品編碼    訂單數量    發貨數量     待執行數量       
-- ---------- ----------------- ------------- -------------- --------------- ------------------   -----------------------
-- A1         2005-05-01      ABCD             100             100                    0
-- A2         2005-05-03      ABCD             200             200                    0
-- A3         2005-05-04      ABCD             300             200                100
-- A4         2005-05-08      ABCD             500                 0                500
-- -----------------------------------------------------------------------------------------------------------------------
--                                       合計          1100         500             600
-- 
-- 查詢處理的過程
-- SELECT     A.單號,A.日期,A.貨品編碼,  
--    訂單數量=A.數量,
--    發貨數量=ISNULL(CASE WHEN A.S數量<B.數量 THEN A.數量 ELSE B.數量-A.P數量 END,0),
--    待執行數量=CASE WHEN A.S數量<B.數量 THEN 0 ELSE A.S數量-ISNULL(B.數量,A.P數量) END
-- INTO # FROM(
--     SELECT 單號,日期=CONVERT(CHAR(10),日期,120),貨品編碼,
--         數量=SUM(數量),
--         P數量=ISNULL((SELECT SUM(數量) FROM 銷售訂單
--      WHERE 貨品編碼=A.貨品編碼      AND(DATEDIFF(DAY,日期,MIN(A.日期))>0   OR DATEDIFF(DAY,日期,MIN(A.日期))=0 AND 單號<A.單號)),0),
--         S數量=ISNULL((SELECT SUM(數量) FROM 銷售訂單
--              WHERE 貨品編碼=A.貨品編碼  AND(DATEDIFF(DAY,日期,MIN(A.日期))>0  OR DATEDIFF(DAY,日期,MIN(A.日期))=0 AND 單號<=A.單號)),0)
--     FROM 銷售訂單 A
--     GROUP BY 單號,CONVERT(CHAR(10),日期,120),貨品編碼
-- )A 
--     LEFT JOIN(
--         SELECT 貨品編碼,數量=SUM(數量)
--         FROM 銷售發貨單
--         GROUP BY 貨品編碼
--     )B ON A.貨品編碼=B.貨品編碼
--         AND A.P數量<B.數量
-- ORDER BY A.單號,A.日期,A.貨品編碼
-- 
-- SELECT * FROM #
-- UNION ALL
-- SELECT '','','合計',SUM(訂單數量),SUM(發貨數量),SUM(待執行數量) FROM #
-- DROP TABLE #

#5


把你的庫存量當作發貨量來考慮套用,速度很快,和用游標相比快的太多了,經典算法喲,呵呵

#6


謝謝 好好研究一下 如有效立即給分。另外敢問westbulls 是從哪里看到鄒大的作品的 俺也想看看

#7


鄒老大出了一本書呀,呵呵,人郵的

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com