从一个表中选择不同的值,然后与另一个表连接

时间:2019-11-26 11:20:55

标签: sql sql-server sql-server-2012 sql-server-2017

我有一个问题,我花了很多时间试图弄清楚,但几乎没有成功。.我将尽我所能描述问题,并举一个例子,是我现在使用的解决方案。

我有两个不同的MS SQL表。

表1:

  • itemNumber-192031、533853等
  • date-添加数据库帖子的日期
  • 数量-每个商品编号的商品数量

表2:

  • MTITNO-也是项目号,包含许多不同的项目号(比表1还要多)
  • MTTRDT-添加数据库帖子的日期
  • MTTYP-交易类型。我将寻找MTTYP = 11
  • MTTRQT-交易数量。我将寻找MTTRQT <0

所以我要做的是从表1的两个日期之间获得DISTINCT itemNumber。一旦有了这些项目号,我就希望将表2加入到项目号上,并且还要在我使用的相同日期之间查询表1。我还只需要从表2中获取值,其中MTTYP = 11且MTTRQT <0且SUM MTTRQT。

我已经通过使用Java代码中的循环对它进行了排序,说实话这不好。我的工作是这样:

  1. SELECT DISTINCT itemNumber“ itemNumber”
    表1
    @fromDate和@toDate之间的日期;

  2. 从此结果中获取最高值(即第一个商品编号),然后:

  3. SELECT Sum(MTTRQT)“ SUM_MTTRQT_”
    从表2
    WHERE MTITNO =“来自上面结果查询的第一个商品编号”
       AND MTTTYP = 11
       @fromDate和@toDate之间的AND MTTRDT
       AND MITTRA.MTTRQT <0

  4. 将结果添加到新列表。删除使用的商品编号

  5. 浏览列表中的所有项目编号,并对每个项目编号运行步骤3和4(这是很糟糕的部分)。

当然必须有一个产生相同结果的SQL查询!

感谢我可以获得的任何帮助!

更新: 这是我的数据。
表1

|Item number | Quantity | date
 192031      |    1     | 20190521
 192031      |    1     | 20190522
 19192301    |    2     | 20190521
 19189507    |    1     | 20190523
 19189507    |    1     | 20190521
 19189507    |    1     | 20190524

表2

|MTITNO    | MTTRDT   | MTTTYP | MTTRQT
 192031    | 20190520 | 11     | -1
 192031    | 20190520 | 11     | -1
 192031    | 20190520 | 11     | -1
 192031    | 20190520 | 11     | -1
 19189507  | 20190520 | 11     | -1
 19189507  | 20190520 | 11     | -1
 19189507  | 20190520 | 11     | -1
 19189507  | 20190520 | 11     | -1
 19189507  | 20190521 | 11     | -1
 19189507  | 20190521 | 11     | -1
 19189507  | 20190521 | 11     | -1

表2包含各种项目编号(即,您可以在表2中找到的项目编号,但在表1中找不到),以及更多的帖子。表1中可以有一个帖子,表2中没有一个或多个项目编号的帖子。

我想总结所有项目的MTTRQT,其中项目编号在表1和表2中以及在我设置的日期范围内。以下期望结果中的“已用数量”是每个商品编号的MTTRQT。

所需结果
因此,如果我查找日期在20190520-20190524之间的所有商品编号,则应获得以下列表。
表1中的“物料编号”应该是DISTINCT物料编号。

“已用金额”是SUM函数,用于求和满足所有条件的MTTRQT。

|Item Number | Amount used
 192031      | -4     
 19189507    | -7 

3 个答案:

答案 0 :(得分:1)

通读一些话,但这不是你所追求的吗?

SELECT SUM(T2.MTTRQT) AS [SUM_MTTRQT_]
FROM [Table 2] T2
     LEFT JOIN (SELECT TOP (1)
                       T1.ItemNumber
                FROM [Table 1] T1
                WHERE T1.[date] BETWEEN @fromDate AND @toDate --Note, if [date] has a time portion, this is unlikely to work as you expect
                ORDER BY T1.ItemNumber) T1 ON T2.MTITNO = T1.ItemNumber --Assumed ORDER BY clause
WHERE T2.MTTTYP = 11
  AND T2.MTTRDT BETWEEN @fromDate AND @toDate --Note, if MTTRDT has a time portion, this is unlikely to work as you expect
  AND T2.MITTRA.MTTRQT < 0;

答案 1 :(得分:1)

如果我正确地遵循了您的逻辑:

select sum(mttrqt)
from table2 t2
where t2.mtitno in (select t1.itemno
                    from table1 t1
                    where t1.date >= @date1 and t1.date <= @date2
                   ) and
      t2.mttrdt >= @date1 and
      t2.mttrdt <= @date1 and
      t2.mttype = 11 and
      t2.mttrqt < 10;

答案 2 :(得分:0)

您尝试过吗:

SELECT Sum(MTTRQT) "SUM_MTTRQT_"
FROM Table 2
WHERE MTITNO in (SELECT DISTINCT itemNumber "itemNumber"
FROM Table 1
WHERE date BETWEEN @fromDate AND @toDate;)
AND MTTTYP = 11
AND MTTRDT BETWEEN @fromDate AND @toDate
AND MITTRA.MTTRQT < 0