SQL,根据分组选择的最小值从第二个表中获取值

标签 sql sql-server join

我在下面有一个查询,我列出了所有尚未清空的交易,目标是获取包含所有打开的交易ID(代表客户订单)及其发票编号的列表。

Table 1
transactionID
bookdate
cost
year

Table 2
transactionID
invoice
year

SELECT 1.transactionID, Sum(cost), 1.Max(bookdate), 2.invoice
FROM 1
LEFT JOIN 2
ON 1.transactionID = 2. transactionID AND 1.year = 2.year
GROUP BY 1.transactionID, 2.invoice
HAVING (Sum(cost)<>0)

我的问题是 transactionID 每年都会重复使用,这就是为什么我需要检查实际 transactionID 与表 2 中的发票之间的年份是否对应。

每个 transactionID 都有多个具有不同预订日期的交易。这意味着一笔交易可能发生在 2011 年,另一笔交易可能发生在 2012 年。我希望查询查找与每个开放交易 ID 的最早预订日期相对应的年份。

例如:

表1

1 | 20120101 | -20  | 2012
2 | 20120501 | -100 | 2012
2 | 20110501 | 100  | 2012
1 | 20110801 | 50   | 2011

表2

1 | invoice X   | 2012
2 | invoice Y   | 2012
1 | invoice old | 2011

结果应该是

1 | 30 USD | Invoice old

最佳答案

如果您使用的是 SQL Server 2005 或更高版本,则可以使用 window函数如下:

WITH summedAndRanked AS (
  SELECT
    [1].transactionID,
    [2].invoice,
    totalCost    = SUM(cost)     OVER (PARTITION BY [1].transactionID),
    lastBookDate = MAX(bookdate) OVER (PARTITION BY [1].transactionID),
    rnk          = DENSE_RANK()  OVER (PARTITION BY [1].transactionID ORDER BY [1].year),
  FROM [1]
    LEFT JOIN [2]
      ON [1].transactionID = [2].transactionID
     AND [1].year = [2].year
)
SELECT DISTINCT
  TransactionID,
  totalCost,
  lastBookDate,
  invoice
FROM countedAndRanked
WHERE totalCost <> 0
  AND rnk = 1
;

关于SQL,根据分组选择的最小值从第二个表中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12279624/

相关文章:

java - 错误 "; expected",sql 语句

mysql - 优化mysql子查询语句

c# - 如何更改已部署应用程序中的数据库设计?

sql - 如何按月(("Both"YEAR & MONTH)对表进行分区并自动创建每月分区?

asp.net - sisoDB是否使用sql server数据库来存储数据

mysql - 如何在 MySQL 中查找具有与另一个表行数据相似的数据的所有行?

mysql - 给所有经理加薪 10%,除非工资超过 100,000 美元;在这种情况下,只加薪 3%

oracle - 是否可以将配置单元表与 oracle 表连接起来?

database - 如何在 Cakephp 的分页函数中使用 OR 条件?

sql - 函数不返回任何内容 Postgresql