繁体   English   中英

SQL Server:根据 SELECT TOP 100 列选择 TOP 10 列

[英]SQL Server : Select TOP 10 Column based on SELECT TOP 100 Column

我有3张桌子A,B,C

  • A 有 ID 和 Name 列
  • B 有 ID 和 PIN 列
  • C 有 Name 和 Amount 列

为了获得前 10 个 PIN 的总数,我使用:

SELECT TOP 10 PIN, SUM(Amount) AS PIN_Amount 
FROM A, B, C 
WHERE
    C.Name IN(A.Name) AND (A.ID = B.ID)
GROUP BY PIN
ORDER BY PIN_Amount DESC

如何仅获得前 10 个 PIN 的 TOP 100 Amount?

这是我的表:

CREATE TABLE [dbo].[A](
    [ID] [int] NOT NULL,
    [Name] [varchar](10) NULL,
 CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[B](
    [ID] [int] NULL,
    [PIN] [int] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[C](
    [Name] [varchar](10) NOT NULL,
    [Amount] [int] NULL,
 CONSTRAINT [PK_C] PRIMARY KEY CLUSTERED 
(
    [Name] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

您可以使用common_table_expression来实现它。

;WITH cte_TempTable AS (
  SELECT TOP 10 PIN, SUM(Amount) AS PIN_Amount 
  FROM A
  INNER JOIN B ON  A.ID = B.ID
  INNER JOIN C ON  C.Name = A.Name
  GROUP BY PIN
  ORDER BY PIN_Amount DESC)

SELECT TOP 100 C.Amount 
FROM A
  INNER JOIN B ON  A.ID = B.ID
  INNER JOIN C ON  C.Name = A.Name
INNER JOIN cte_TempTable ON cte_TempTable.PIN =  B.PIN 
ORDER BY C.Amount DESC

我的重现显示 SUM 为 100

CREATE TABLE dbo.A ([ID] int IDENTITY (1,1), [Name] varchar(10))
GO
CREATE TABLE dbo.B (ID INT, PIN INT)
GO
CREATE TABLE dbo.C ([Name] varchar(10), [Amount] INT)
GO

-- This inserts 1000 rows into table C 
DECLARE @counter INT = 1
WHILE @counter <= 1000
BEGIN
    INSERT dbo.C ([Name], [Amount]) 
    VALUES ('Test', 1)
    SELECT @counter += 1
END
GO

-- This inserts 1 record in Table A
INSERT dbo.A ([Name])
VALUES ('Test')
GO

-- This inserts 1 row in table B and ensures that the ID valu is
-- the same as table A
INSERT dbo.B (ID, PIN)
SELECT ID, 1234
FROM dbo.A
GO

SELECT TOP(10) PIN, SUM(D.Amount) as PIN_Amount
FROM A
JOIN B on A.ID = B.ID
CROSS APPLY (SELECT TOP (100) Amount FROM C WHERE Name = A.Name ORDER BY Amount DESC) D
GROUP BY PIN
ORDER BY PIN_Amount DESC

这导致输出:

PIN         PIN_Amount
1234    100

正如预期的那样,这完全是来自 C 的前 100 个值

这可能对你有帮助!

SELECT AID, ANAME, BPIN, C2.AMOUNT
(
    SELECT TOP 10 A.ID AID, A.NAME ANAME, B.PIN BPIN
    FROM A INNER JOIN B
    ON A.ID = B.ID
    --ORDER BY YOUR_COLUMN_IN_CASE
) AS A2
LEFT JOIN (
    SELECT NAME,AMOUNT,
    ROW_NUMBER() OVER(ORDER BY Name) AS ROW_ID
    FROM C
    --ORDER BY NAME,YOUR_COLUMN_IN_CASE
) AS C2
ON A2.ANAME = C2.NAME
WHERE C2.ROW_ID < 101;

两个子查询中的ORDER BY ,您可以根据您的TOP10 & TOP100要求进行修改!

从 SQL Server 2012 开始,您可以使用 OFFSET... FETCH 运算符。 阅读更多关于偏移获取

我建议您使用 ANSI JOIN 语法。

SELECT B.PIN, SUM(C.Amount) AS total_amount
FROM A
INNER JOIN B ON A.ID = B.ID
INNER JOIN C ON A.Name = C.Name 
GROUP BY B.PIN
ORDER BY total_amount
OFFSET 0 ROWS
FETCH 10 ROWS ONLY;

对于早期版本的 SQL Server,您可以使用 TOP 子句。

SELECT TOP 10 B.PIN, SUM(C.Amount) AS total_amount
FROM A
INNER JOIN B ON A.ID = B.ID
INNER JOIN C ON A.Name = C.Name 
GROUP BY B.PIN
ORDER BY total_amount;

暂无
暂无

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

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