首页 > 解决方案 > SQL Server:根据 SELECT TOP 100 Column 选择 TOP 10 Column

问题描述

我有 3 张桌子 A、B、C

为了获得前 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 的前 100 名金额?

这是我的桌子:

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

标签: sqlsql-serversql-server-2008

解决方案


你可以用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

推荐阅读