Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 和WHERE求和_Sql Server_Join_Sum_Subquery - Fatal编程技术网

Sql server 和WHERE求和

Sql server 和WHERE求和,sql-server,join,sum,subquery,Sql Server,Join,Sum,Subquery,我无法从现有的类似线程中找出这一点。我尝试过左连接和不同类型的子查询,但没有成功。 我被允许加入GroupBy的工作,但我不知道如何添加where子句,然后我就不能加入子查询,并破坏了一切 我有两个表存储和订单 存储器具有唯一的id和名称的列表 id | name 1234 | product1 1235 | product2 A123 | product3 code | qty| type 1234 | 10 | order 1234 | 10 | quo

我无法从现有的类似线程中找出这一点。我尝试过左连接和不同类型的子查询,但没有成功。 我被允许加入GroupBy的工作,但我不知道如何添加where子句,然后我就不能加入子查询,并破坏了一切

我有两个表存储订单

存储器具有唯一的id名称的列表

    id   | name
    1234 | product1
    1235 | product2
    A123 | product3
code | qty| type
1234 | 10 | order
1234 | 10 | quote
1234 | 10 | order
A123 | 15 | order
1235 | 13 | order
订单有多个实例代码数量类型

    id   | name
    1234 | product1
    1235 | product2
    A123 | product3
code | qty| type
1234 | 10 | order
1234 | 10 | quote
1234 | 10 | order
A123 | 15 | order
1235 | 13 | order
我不想联接这些表,以便从存储中获得过滤(带where)结果,并联接合计数量,其中类型为订单

例如,过滤器存储其中(1234,A123)中的id应产生:

id   | name     | sum qty    
1234 | product1 | 20
A123 | product3 | 15
感谢您的帮助

--

展望未来,存储有产品和COL。有一个表prod_to_col,它有productid和col_id将它们连接在一起。 我需要从表prod_到col中获取产品代码,并根据订单数量显示col的总数量

我根据@iSR5示例进行了尝试:

SELECT st.id, st.name, SUM(order.qty) AS SumQty
FROM storage
JOIN prod_to_col ON st.id=prod_to_col.col_id 
JOIN orders ON order.id IN (SELECT prod_id FROM prod_to_col WHERE col_id=st.id) AND type='order'
WHERE id IN (1234, A123)
GROUP BY st.id, st.name 
这几乎是可行的,但数量在某些行中是相乘的,有些是好的,有人能指出哪里出错了吗

除了上面的存储表和订单外,以下是prod_to_col和cols的示例:

生产线

prod_id | col_id | col_qty (per product)
1235    | C101   | 2
1236    | C102   | 1 
科尔斯

命令

prod_id | qty | type
1235    | 10  | order
1235    | 10  | order
1236    | 2   | quote
1236    | 5   | order
储藏

st.id | st.name| SumQty
C101  | cname1 | 40
C102  | cname2 |  5

我知道我需要使用两个不同的句子来填充存储列表,一个用于产品,一个用于COL。用于产品的一个很好。

尝试使用Left Join和group by组合

SELECT OD.CODE
      ,ST.PRODUCT
      ,SUM(quantity) as qnt
FROM ORDERS OD 
     LEFT JOIN STORAGE ST ON(OD.CODE = SG.CODE)
WHERE OD.type like 'order'
GROUP BY
      OD.CODE
      ,ST.PRODUCT
你可以使用过滤器

Having id in (1234, A123)

问候语这是你需要的吗

DECLARE @Storage TABLE(ID VARCHAR(50), name VARCHAR(250) )
DECLARE @Orders TABLE(code VARCHAR(50), qty INT, type VARCHAR(50))

INSERT INTO @Storage VALUES
    ('1234','product1')
,   ('1235','product2')
,   ('A123','product3')

INSERT INTO @Orders VALUES 
    ('1234',10,'order')
,   ('1234',10,'quote')
,   ('1234',10,'order')
,   ('A123',15,'order')
,   ('1235',13,'order')

SELECT 
    s.ID 
,   s.name 
,   SUM(o.qty) TotalQty
FROM 
    @Storage s 
JOIN @Orders o ON o.code = s.ID AND o.type = 'order'
WHERE 
    s.ID IN('1234','A123')
GROUP BY 
    s.ID 
,   s.name  
更新

你已经用更多的逻辑来更新你的帖子,这是以前没有提供的,但是,我已经为你更新了查询

DECLARE @Storage TABLE(ID VARCHAR(50), name VARCHAR(250) )
DECLARE @Orders TABLE(code VARCHAR(50), qty INT, type VARCHAR(50))
DECLARE @Prod_to_col TABLE(prod_id VARCHAR(50), col_id  VARCHAR(50), col_qty INT)
DECLARE @Cols TABLE(col_id VARCHAR(50), name  VARCHAR(250))


INSERT INTO @Storage VALUES
    ('1234','product1')
,   ('1235','product2')
,   ('A123','product3')
,   ('1236','product3')

INSERT INTO @Orders VALUES 
    ('1234',10,'order')
,   ('1234',10,'quote')
,   ('1234',10,'order')
,   ('A123',15,'order')
,   ('1235',10,'order')
,   ('1235',10,'order')
,   ('1236',2,'quote')
,   ('1236',5,'order')

INSERT INTO @Prod_to_col VALUES 
    ('1235','C101',2)
,   ('1236','C102',1)


INSERT INTO @Cols VALUES 
    ('C101','cname1')
,   ('C102','cname2')




SELECT 
    c.col_id 
,   c.name 
,   SUM(o.qty) * MAX(ptc.col_qty) TotalQty
FROM 
    @Storage s 
JOIN @Orders o ON o.code = s.ID AND o.type = 'order'
JOIN @Prod_to_col ptc ON ptc.prod_id = o.code
JOIN @Cols c ON c.col_id = ptc.col_id
--WHERE 
--    s.ID IN('1234','A123')
GROUP BY 
    c.col_id 
,   c.name 

我尝试了左连接和不同类型的子查询,但没有成功。
我将问题扩展到包含子查询是同一句话。这似乎是一个常见的错误,人们希望连接单独的连接组聚合。有时可以通过一系列连接来表示,然后是唯一的聚合。请总是用谷歌搜索你的问题/问题/目标的许多清晰、简洁和具体的版本/措辞,有或没有你的特定字符串/名称,并阅读许多答案。将发现的相关关键字添加到搜索中。如果你找不到答案,就发布,使用1个变体搜索作为标签的标题和关键字。请参见文本上方的向下投票箭头鼠标。当你有一个非重复代码问题要发布时,请阅读并采取行动。但我不想对type=order的问题求和。我不明白这个例子是怎么做到的。好的,你们可以在同一个句子中使用WHERE和have。工作正常,谢谢!因此,在本例中,where子句替换为join上的扩展声明。我那未经训练的眼睛说这也行,但不能确定。我想我会选择where,因为实际情况比我的简化示例有更多的条件。@rami如果你直接在连接上使用过滤,你只会连接那组记录,但是如果你把它移到where下面,您的联接将获取另一个表中与
code=id
匹配的所有内容,然后它将从WHERE-caluse中过滤这些内容。因此,两者的输出相同,但性能会有所不同,特别是在大型表格中。感谢您的深入解释,谢谢。经过测试,它完全符合我的需要。我将继续下一步,看看哪一个解决方案更容易用更多的表来扩展。你们能看看带子查询的编辑文章吗?谢谢@rami尝试将order.id=prod\u连接到col.prod\u id和type='order',如果不起作用,请提供存储、订单和prod\u连接到col的表格模式以及每个表格的示例。