2012-12-29 118 views
0

我正在檢索mlog表的結果,並在下面的代碼1的幫助下計算qtyn的小計。我一直堅持如何加入第一個代碼標準。與集合函數運行總和

感謝您的幫助

1.

SELECT autn, date, itcode, qtyn, out, 
     date, phstock, 
     qtyn + COALESCE(
       (SELECT SUM(qtyn) FROM dbo.mlog b 
       WHERE b.autn < a.autn 
        AND itcode = '40'), 0) AS balance 
FROM dbo.mlog a 
WHERE (itcode = '40') 
ORDER BY autn 

2.

date >=(SELECT MAX([date]) FROM mlog) 
+0

@MartinSmith也許'SQL Server' '專欄。 *我猜*。 –

+0

@marc_s sql 2005 – apfiru

+0

@marc_s Microsoft SQL Server 2005 - 9.00.1399.06 – apfiru

回答

2

要追加一個狀態到代碼中,使用ANDOR。 EG:

SELECT a.autn, a.date, a.itcode, a.qtyn, a.out, 
     a.date, a.phstock, 
     a.qtyn + COALESCE(
       (SELECT SUM(b.qtyn) FROM dbo.mlog b 
       WHERE b.autn < a.autn 
        AND b.itcode = '40'), 0) AS balance 
FROM dbo.mlog a 
WHERE (a.itcode = '40' AND a.date >= (SELECT MAX([c.date]) FROM mlog c)) 
ORDER BY a.autn 

沒有測試,但應該做你想要

+0

它肯定有助於在所有條件中添加明確的別名前綴。 – alzaimar

+0

@alzaimar我批准了編輯。 –

+0

幾乎沒有變化。無論如何,偉大的幫助 – apfiru

0

我聽說SQL Server是相當低效與coalesce()什麼,因爲它運行的第一部分的兩倍。下面是寫這個的另一種方式:

with ml as (
    SELECT ml.autn, ml.date, ml.itcode, ml.qtyn, ml.out, ml.date, ml.phstock 
    FROM dbo.mlog ml 
    WHERE ml.itcode = '40' AND ml.date >= (SELECT MAX(ml1.date]) FROM mlog ml1) 
    ) 
select ml.*, 
     (select sum(m1l.qtyn) from ml ml1 where ml1.autn <= ml.autn) as balance 
from ml 
ORDER BY ml.autn 

我也想知道,如果where條款是更有效,因爲:因爲周圍`日期所用的支架

WHERE ml.itcode = '40' AND ml.date = (SELECT top 1 ml1.date FROM mlog ml1 order by ml1.date desc) 
+0

'COALESCE'變成了一個'CASE'聲明,並且是ANSI標準。 'ISNULL'不是標準的。另外,優先順序在'COALESCE'中生效。閱讀更多:http://dba.stackexchange.com/a/30013/2334 –