sql - 如何插入 Select every with TOP() 子句

标签 sql tsql

这是我的 table ,

http://sqlfiddle.com/#!3/a8087/1

我想要实现的是通过从 Tbl2 和 CustTable 中选择来插入到另一个新表中。

例如:

INSERT INTO tbl3
SELECT TOP(SELECT Counter FROM Tbl2) a.name, a.amount FROM custTable a
INNER JOIN Tbl2 b ON a.custId = b.custid

我想根据 CustId 的 [Counter] 插入 X 行数。 它不起作用,因为子查询返回了超过 1 个值。

如何修复 TOP() 中的查询?

最佳答案

您可以使用窗口函数按客户对行进行排名,然后按计数器进行过滤:

WITH cte as
(
  SELECT a.Name, a.Amount, b.Counter, 
   ROW_NUMBER() OVER (PARTITION BY a.CustID ORDER BY a.Amount DESC) AS RN
  FROM custTable a
  INNER JOIN Tbl2 b ON a.custId = b.custid  
)
SELECT cte.name, cte.amount 
INTO tbl3
FROM cte
WHERE cte.rn <= Counter;

您需要为每个客户选择一个 ORDER 以确定包含“哪些”TOP 记录(我假设您想要此处的最高金额)

我还使用 SELECT ... INTO 即时创建表 3,但如果它已经创建,您可以 INSERT INTO

Updated your SqlFiddle here

关于sql - 如何插入 Select every with TOP() 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23670233/

相关文章:

sql - 通过sql对分区计数不同

sql - 在tsql中使用 bool 代数来避免CASE语句或处理复杂的WHERE条件

sql - 在 SQL 中将多行合并为一行

mysql - 获取匹配所有搜索查询的结果

mysql - 在 MySQL (InnoDB) 中计算年龄

sql - 如何在 SQL Server 中为分组依据中的 max(column) 的另一列选择等效行

sql-server - Sql 按年份范围分组

sql - 删除SQL Server数据库中的所有数据

MySQL - 在插入之前用单引号包围预先计算的变量

sql - NOLOCK(Sql Server 提示)是不好的做法吗?