表a字段:CLS, NUM, LINE, SETTLENO, GDGID, QTY, WSPRC, PRICE, TOTAL, TAX, INPRC, WRH, NOTE, COST, lstupdtime, rtlprc 表b是表a的子表,字段:cls,num,line 用SqlServer,取表a内cls,num,line等于表b的数据,把数据按cls,num,line分组,先按QTY + TAX降序排序,QTY + TAX一样的时候按lstupdtime降序排序,最后取每个分组的第一条数据
时间: 2023-07-27 22:10:46 浏览: 306
使用交叉联接续-SQL查询(多表查询)
可以使用以下SQL语句实现:
```
SELECT a.*
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY cls, num, line ORDER BY qty + tax DESC, lstupdtime DESC) AS rn
FROM table_a
) a
INNER JOIN table_b b
ON a.cls = b.cls AND a.num = b.num AND a.line = b.line
WHERE rn = 1
```
解释一下SQL语句:
1. 首先使用子查询将表a的数据按cls、num、line分组,并按QTY + TAX降序排序,QTY + TAX相同时按lstupdtime降序排序。同时为每个分组中的数据添加一个行号rn。
2. 然后将表a和表b进行内连接,连接条件是a表的cls、num、line等于b表的对应字段。
3. 最后在子查询的结果上,筛选出rn等于1的数据,即每个分组中QTY + TAX最大、lstupdtime最晚的数据。
注意,这里使用了ROW_NUMBER()函数来为每个分组中的数据添加行号,这需要在SQL Server 2005及以上版本才支持。如果你的SQL Server版本较低,可以使用类似以下的语句代替:
```
SELECT a.*
FROM table_a a
INNER JOIN table_b b
ON a.cls = b.cls AND a.num = b.num AND a.line = b.line
WHERE NOT EXISTS (
SELECT 1
FROM table_a a2
WHERE a2.cls = a.cls AND a2.num = a.num AND a2.line = a.line
AND (a2.qty + a2.tax > a.qty + a.tax OR (a2.qty + a2.tax = a.qty + a.tax AND a2.lstupdtime > a.lstupdtime))
)
```
阅读全文