2011-12-06 142 views
0

這個工作在MS SQL:表字段不能約束

SELECT  TOP (100) PERCENT SUM(P.bedrag) AS ex 
FROM   dbo.verkopen AS P INNER JOIN 
         (SELECT DISTINCT dbo.verkopen.ino 
         FROM   dbo.verkopen INNER JOIN 
               dbo.doss ON dbo.verkopen.ino =   dbo.doss.ino   INNER  JOIN 
               dbo.vdagbk ON dbo.verkopen.ino = dbo.vdagbk.ino 
         WHERE  (dbo.doss.uitvoerder LIKE 'LL') AND (dbo.doss.dosno LIKE '101520')) AS C ON C.ino = P.ino 

我不得不那樣做,因爲在我的結果複製某些行。

但我想這樣做吧:

SELECT  TOP (100) PERCENT doss.dosno, doss.dosnm, SUM(P.bedrag) AS TotBedraggefactureerd, SUM(P.betaald) AS TotBetaald, SUM(P.totincl) AS TotIncl, 
        SUM(vdagbk.beginsaldo) AS totbeginsaldoontvangen, SUM(vdagbk.eindsaldo) AS toteindsaldoontvangen, 
        SUM(CASE vdagbk.reden WHEN 'H' THEN vdagbk.bedrag END) AS ontvangenhonoraria, SUM(CASE vdagbk.reden WHEN 'P' THEN vdagbk.bedrag END) 
        AS ontvangenprov, SUM(CASE vdagbk.reden WHEN 'A' THEN vdagbk.bedrag END) AS dagboekA, SUM(CASE vdagbk.reden WHEN 'G' THEN vdagbk.bedrag END) 
        AS dagboekG, SUM(CASE vdagbk.reden WHEN 'E' THEN vdagbk.bedrag END) AS dagboekE 
FROM   dbo.verkopen AS P INNER JOIN 
         (SELECT DISTINCT dbo.verkopen.ino 
         FROM   dbo.verkopen INNER JOIN 
               dbo.doss ON dbo.verkopen.ino = dbo.doss.ino INNER JOIN 
               dbo.vdagbk ON dbo.verkopen.ino = dbo.vdagbk.ino 
         WHERE  (dbo.doss.uitvoerder LIKE 'LL') AND (dbo.doss.dosno LIKE '101520')) AS C ON C.ino = P.ino 
GROUP BY doss.dosno, doss.dosnm 
ORDER BY doss.dosno 

我知道這是現在一切搞砸了。我可以做一個小小的SQL,但這有點過頭了。

我知道它只包含.ino,但我現在在查詢中放什麼。

我有這樣的:

`SELECT  TOP (100) PERCENT doss.dosno, doss.dosnm, SUM(verkopen.bedrag)/2 AS TotBedraggefactureerd, SUM(verkopen.betaald) AS TotBetaald, SUM(verkopen.totincl) 
        AS TotIncl, SUM(vdagbk.beginsaldo) AS totbeginsaldoontvangen, SUM(vdagbk.eindsaldo) AS toteindsaldoontvangen, 
        SUM(CASE vdagbk.reden WHEN 'H' THEN vdagbk.bedrag END) AS ontvangenhonoraria, SUM(CASE vdagbk.reden WHEN 'P' THEN vdagbk.bedrag END) 
        AS ontvangenprov, SUM(CASE vdagbk.reden WHEN 'A' THEN vdagbk.bedrag END) AS dagboekA, SUM(CASE vdagbk.reden WHEN 'G' THEN vdagbk.bedrag END) 
        AS dagboekG, SUM(CASE vdagbk.reden WHEN 'E' THEN vdagbk.bedrag END) AS dagboekE 
FROM   verkopen INNER JOIN 
        doss ON verkopen.ino = doss.ino INNER JOIN 
        vdagbk ON verkopen.ino = vdagbk.ino 
WHERE  (dbo.doss.uitvoerder LIKE 'LL') AND (dbo.doss.dosno LIKE '101520') GROUP BY doss.dosno, doss.dosnm 
ORDER BY doss.dosno 
` 

但返回的結果在某些情況下的兩倍。

+0

您可能會覺得有用的一些關注點:首先,您可以擺脫「Top(100)Percent」位。這隻會讓你的代碼複雜化,而且什麼都不做。其次,SQL Server不怕一些額外的換行符。因此,您可以通過將totbeginsaldoontvangen和TotBedraggefactureerd以及所有其他代碼放在單獨的行中來使代碼更易於閱讀。 – PowerUser

回答

0

在您的SELECT中,只有別名PC可用。

dossvdagbk別名在派生表的內部:派生表無論如何只返回dbo.verkopen.ino

我會考慮刪除派生表而直接加入

0

ino是主鍵,是嗎?在這種情況下,您應該通過查找一些具體示例來調查重複項。在3個源表中查找這些ino值。這些表中至少有一個可能具有重複值。

+0

是的我知道使用我的時候會有雙打(第二個查詢);使用第一個查詢它以某種方式'刪除'這些雙打。所以我想將這個查詢方法實現爲第三個查詢。但我不知道該怎麼做。 –

+0

'Select Distinct'可能會訣竅,但我強烈建議您首先調查爲什麼有雙打首先。您可能會發現需要以某種方式處理源數據的複雜情況。 – PowerUser