繁体   English   中英

从一个表中选择不同的值并连接到另一个表

[英]Select distinct values from one table and join with another table

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

我有两个不同的 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. 选择总和(MTTRQT)“SUM_MTTRQT_”
    从表 2
    WHERE MTITNO = "上面查询结果的第一个项目编号"
    和 MTTTYP = 11
    和 MTTRDT 在 @fromDate 和 @toDate 之间
    和 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 中没有帖子。

我想总结一下项目编号在表 1 和表 2 中以及在我设置的日期范围内的所有项目的 MTTRQT。 下面所需结果中的“使用量”是每个单个项目编号的 MTTRQT 相加。

想要的结果
因此,如果我查找日期在 20190520 - 20190524 之间的所有项目编号,我应该得到下面的列表。
“项目编号”应该是表 1 中的 DISTINCT 项目编号。

“使用量”是 SUM 函数,它对满足所有条件的 MTTRQT 求和。

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

稍微通读一下,但这不是你想要的吗?

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;

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

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;

你有没有试过这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM