[英]Select distinct values from one table and join with another table
我有一个问题,我花了很多时间试图弄清楚,但几乎没有成功。我会尽量描述这个问题,并使用一个例子,这是解决方案我现在用。
我有两个不同的 MS SQL 表。
表格1:
表 2:
所以我想要做的是从表 1 中的两个日期之间获取 DISTINCT itemNumber。一旦我有了这些项目编号,我想加入表 2 的项目编号,以及我在查询表中使用的相同日期之间1. 我也只需要从表 2 中获取值,其中 MTTYP = 11 和 MTTRQT < 0 和 SUM MTTRQT。
我已经通过在 Java 代码中使用循环对其进行了排序,老实说这不太好。 我做的是这样的:
SELECT DISTINCT itemNumber "itemNumber"
从表 1
在@fromDate 和@toDate 之间的日期;
从此结果中取最高值(即第一个项目编号),然后:
选择总和(MTTRQT)“SUM_MTTRQT_”
从表 2
WHERE MTITNO = "上面查询结果的第一个项目编号"
和 MTTTYP = 11
和 MTTRDT 在 @fromDate 和 @toDate 之间
和 MITTRA.MTTRQT < 0
将结果添加到新列表中。 删除使用的项目编号
循环遍历列表中的所有项目编号,并对每个项目编号运行第 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.