[英]SQL Server : Select TOP 10 Column based on SELECT TOP 100 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 的 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.