2011-02-16 50 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