2011-02-16 47 views
1

變量進行數學這裏是什麼我迄今嘗試的例子的SQL查詢:創建與來自多個表

的表會是什麼樣子樣機:

庫存

ID | lowrange | highrange 
------------------------------- 
1 | 15  | 20 
2 | 21  | 30 

審計(從加入這個查詢旁白未使用)

MissingOrVoid

ID | Item | Missing | Void 
--------------------------------- 
1 | 17 | 1  | 0 
1 | 19 | 1  | 0 

最近查詢我已經嘗試使用:

SELECT I.*, 
      SUM(
       (I.HIGHRANGE - I.LOWRANGE + 1) 
       - (Count(M.Missing) from M where M.ID = I.ID) 
       - (Count(M.Void) from M where M.ID = I.ID)) AS Item_Quantity 


FROM Inventory I 
    JOIN Audit A 
     ON A.ID = I.ID 
    JOIN MissingOrVoid M 
     ON M.ID = I.ID 

結果應該是:

ID | lowrange | highrange | Item_Quantity 
----------------------------------------------- 
1 | 15  | 20   | 4 
2 | 21  | 30   | 10 

我不記得正是我所做的改動,但在之前收到的錯誤消息的嘗試是「無法對包含聚合或子查詢的表達式執行聚合函數」。目前錯誤是「from」附近的錯誤(M.Missing旁邊的錯誤,但是在我對SQL最少的知識中,似乎這些語法問題導致徹底失敗,並且可能存在直到所有的語法問題都是固定的)。

我真的在轟炸的部分顯然是SUM()部分。我遠離數據庫架構師,所以有人可以解釋如何正確執行此操作,並可能指向資源的方向來了解這種類型的功能?

感謝

+0

我不知道我跟着你的榜樣。在查詢中,「項目」列扮演(應該扮演)角色的一些混淆。隨着Inventory.ID「1」失蹤數看起來像「2」不是「1」(ERGO 20-15-2 = 3),除非你的意思是這樣的加盟庫存MissingOrVoid:...上inventory.id = missingorvoid.item。現在,您將加入ID列。 – Tim 2011-02-16 14:20:38

+0

1爲結構清晰,示出了嘗試和預期的結果 – RichardTheKiwi 2011-02-16 14:55:40

+0

@Tim,缺少的項目都與ID 1,但他們在一個序列中的殼體15,16,17,18,19計數,所以,20是該組中的項目(最初6項)。 20-15 = 5,所以我們必須加1到那個數。減去兩名失蹤的項目,我們就只剩下4 – Robert 2011-02-16 18:13:42

回答

2

你差點沒事了。我猜想失蹤/無效是BIT類型,你不能直接SUM。

SELECT I.*, 
    (I.HIGHRANGE - I.LOWRANGE + 1) 
    - (select Count(nullif(M.Missing,0)) from MissingOrVoid M where M.ID = I.ID) 
    - (select Count(nullif(M.Void,0)) from MissingOrVoid M where M.ID = I.ID) 
    AS Item_Quantity 
FROM Inventory I 

如果項目不能同時爲缺失和空隙,然後

SELECT I.*, 
     I.HIGHRANGE - I.LOWRANGE + 1 
      - (select Count(case when M.Missing=1 or M.Void=1 then 1 end) 
       from MissingOrVoid M where M.ID = I.ID) 
      AS Item_Quantity 
FROM Inventory I 

事實上,如果它是隻存在於MissingOrVoid它丟失時或空隙,然後在上面的查詢的CASE將永遠是真實的,所以這簡化爲

SELECT I.*, 
     I.HIGHRANGE - I.LOWRANGE + 1 
      - (select Count(*) from MissingOrVoid M where M.ID = I.ID) 
      AS Item_Quantity 
FROM Inventory I 
0

最初,我有一個問題,你是否需要總結這些值。如果您的庫存表每個項目有一行,則不需要。我假設你的表可以有一個給定項目的多行,然後從那裏繼續。

我認爲這個問題只是一個問題,與子查詢的構建。我沒有測試過這個,但我認爲它應該看起來更像:

select I.ID, 
    I.Item, 
    SUM(I.HighRange - I.LowRange + 1) 
    - (
     select SUM(M.Missing + M.Void) 
     from dbo.Audit A 
     where A.ID = I.ID 
    ) 
from Inventory I 
group by I.ID, I.Item 
0

這是你正在嘗試做什麼?我不確定在缺失和空列中的數字是什麼,除非它們只是標誌...

SELECT I.*, 
      ((I.highrange - I.lowrange + 1) 
       - SUM(M.Missing) 
       - SUM(M.Void)) AS Item_Quantity 


FROM Inventory I 
    JOIN MissingOrVoid M 
     ON M.ID = I.ID 
0

以下查詢的工作原理。這假定每個ID只有一個高位和低位。

CREATE TABLE #Inventory (ID INT,Lowrange INT,highrange INT) 
CREATE TABLE #MissingOrVoid (Id INT,item INT, missing INT, void INT) 

INSERT #Inventory 
     (ID, Lowrange, highrange) 
VALUES (1, -- ID - int 
      15, -- Lowrange - int 
      20 -- highrange - int 
     ) 
INSERT #Inventory 
     (ID, Lowrange, highrange) 
VALUES (2, -- ID - int 
      21, -- Lowrange - int 
      30 -- highrange - int 
     ) 
INSERT #MissingOrVoid 
     (Id, item, missing, void) 
VALUES (1, -- Id - int 
      17, -- item - int 
      1, -- missing - int 
      0 -- void - int 
     ) 
INSERT #MissingOrVoid 
     (Id, item, missing, void) 
VALUES (1, -- Id - int 
      19, -- item - int 
      1, -- missing - int 
      0 -- void - int 
     ) 


SELECT #Inventory.ID, 
     #Inventory.highrange, 
     #Inventory.Lowrange, 
     highrange-Lowrange+1 
      -SUM(ISNULL(missing,0)) 
      -SUM(ISNULL(void,0)) AS ITEM_QUANTITY 
FROM #Inventory 
left JOIN #MissingOrVoid ON #Inventory.ID = #MissingOrVoid.Id 
GROUP BY #Inventory.ID,#Inventory.highrange,#Inventory.Lowrange 


DROP TABLE #Inventory 
DROP TABLE #MissingOrVoid 
0

我會說這會工作:

SELECT I.ID,I.Lowrange as Lowrange, 
     I.highrange as Highrange, 
     Highrange-Lowrange+1-COUNT(J.missing)-COUNT(J.void) AS ITEM_QUANTITY 
FROM Inventory I 
left JOIN (select missing as missing, void as void, id from MissingOrVoid 
      ) J 
    ON I.ID = J.Id 
JOIN Audit A 
    ON A.ID = I.ID   
GROUP BY I.ID,Highrange,Lowrange 

但它看起來像什麼RemoteSojourner提出了很多(和他的一個也更加美觀)。

0

我要去給派生表的方法,因爲它可能會比一個相關子查詢(按行運行行)快

SELECT I.*,   
I.HIGHRANGE - I.LOWRANGE + 1 - MissingVoidCount AS Item_Quantity 
FROM Inventory I 
JOIN 
    (SELECT ID,Count(*) AS MissingVoidCount FROM MissingOrVoid GROUP BY ID) M 
     on M.ID = I.ID 

當然,在現實生活中,我絕不會使用select *。你也可以使用CTE方法。

;WITH MissingVoid(ID, MissingVoidCount) AS 
    (
     SELECT ID, Count(*) FROM MissingOrVoid GROUP BY ID 
    ) 
    SELECT 
     I.*,   
     I.HIGHRANGE - I.LOWRANGE + 1 - MissingVoidCount AS Item_Quantity 
    FROM Inventory I 
    JOIN MissingVoid M 
     on M.ID = I.ID