2012-11-09 24 views
0

我在SELECT RANK()上使用PIVOT函數(分區...)返回一個表格「矩陣」來顯示我的戰爭遊戲朋友擁有每支軍隊最多的勝利。我想限制矩陣只顯示每個軍隊排名前3的成員(例如,在下圖中的「HE」列中,我想排除等級爲「4」的突出記錄)RANK()與PIVOT() - 限制輸出行數

Army Wins by Member

我認爲我需要包括一個WHERE或TOP子句,但不能確定它的位置。我曾嘗試在此網站和谷歌上查找,但無法找到答案。對不起,如果這是一個學習者的問題,但我還是相當新的SQL Server。

這裏有兩個表[軍]和[戰役](電子表格格式): - https://docs.google.com/spreadsheet/ccc?key=0Ana40VqkvVtRdDAwc1BRWnhsWEdaaTQzcFprQmlyeVE

這裏是我的代碼: -

SELECT * 
FROM 
    (
    SELECT 
     RANK() over(Partition by ArmyMnemonic Order by COUNT(WDL) desc, Member) as ranks, ArmyMnemonic, Army, Member, 
     COUNT(WDL) as Wins 
    FROM 
     [dbo].[Battles] 

    INNER JOIN Armies on Army1 = Armies.ArmyNum 

    Where 
     WDL=2 and Home=1 -- represents a "Win" 
    Group By 
     Member, ArmyMnemonic, Army, WDL 
    ) as rnk 

PIVOT (sum(rnk.ranks) for ArmyMnemonic in([Be],[Br],[DoC],[DE],[Dw],[HE],[Li],[OK],[OG],[Sk],[TE],[TK],[VC],[WoC],[WE])) as pvt 

ORDER BY Wins Desc; 

感謝您的幫助,您可以給。

CREATE TABLE腳本: -

USE [WFBattlesDB] 
GO 

/****** Object: Table [dbo].[Armies] Script Date: 11/09/2012 13:24:15 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[Armies](
[ArmyNum] [int] NOT NULL, 
[ArmyMnemonic] [nvarchar](3) NOT NULL, 
[Army] [char](30) NOT NULL, 
[Official] [bit] NULL, 
[Active] [bit] NULL, 
CONSTRAINT [PK_Armies] PRIMARY KEY CLUSTERED 

( [ArmyNum] 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 

SET ANSI_PADDING OFF 
GO 

USE [WFBattlesDB] 
GO 

/****** Object: Table [dbo].[Battles] Script Date: 11/09/2012 13:25:35 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[Battles](
[keyBattle] [int] IDENTITY(1,1) NOT NULL, 
[subDate] [datetime] NOT NULL, 
[Member] [nvarchar](20) NOT NULL, 
[Home] [bit] NOT NULL, 
[Army1] [int] NOT NULL, 
[Army2] [int] NOT NULL, 
[WDL] [int] NOT NULL, 
[PtsVal] [int] NULL, 
[MVU] [nvarchar](30) NULL, 
[Fun] [int] NULL, 
[Luck] [int] NULL, 
[Notes] [nvarchar](1500) NULL, 
[Link] [nvarchar](255) NULL 

)ON [PRIMARY]

GO 

回答

1

不能在WHERE子句中使用ranks,因爲它是在PIVOT功能使用。因此您可以創建第二個ranks列,以進行過濾。我創建了內第二列選擇:

RANK() over(Partition by ArmyMnemonic Order by COUNT(WDL) desc, Member) as rankFilter 

然後,您可以WHERE子句中使用這樣的:

SELECT Army, Member, Wins, [Be],[Br],[DoC],[DE],[Dw],[HE],[Li],[OK],[OG],[Sk],[TE],[TK],[VC],[WoC],[WE] 
FROM 
(
    SELECT 
     RANK() over(Partition by ArmyMnemonic Order by COUNT(WDL) desc, Member) as ranks, ArmyMnemonic, Army, Member, 
     COUNT(WDL) as Wins, 
     RANK() over(Partition by ArmyMnemonic Order by COUNT(WDL) desc, Member) as rankFilter 
    FROM 
     [dbo].[Battles] 

    INNER JOIN Armies on Army1 = Armies.ArmyNum 

    Where 
     WDL=2 and Home=1 -- represents a "Win" 
    Group By 
     Member, ArmyMnemonic, Army, WDL 
    ) as rnk 

PIVOT (sum(rnk.ranks) for ArmyMnemonic in([Be],[Br],[DoC],[DE],[Dw],[HE],[Li],[OK],[OG],[Sk],[TE],[TK],[VC],[WoC],[WE])) as pvt 
where rankFilter <=3 

ORDER BY Wins Desc; 

或者你可以在子查詢應用WHEREPIVOT前:

SELECT Army, Member, Wins, [Be],[Br],[DoC],[DE],[Dw],[HE],[Li],[OK],[OG],[Sk],[TE],[TK],[VC],[WoC],[WE] 
FROM 
(
    select * 
    from 
    (
     SELECT 
      RANK() over(Partition by ArmyMnemonic Order by COUNT(WDL) desc, Member) as ranks, ArmyMnemonic, Army, Member, 
      COUNT(WDL) as Wins 
     FROM 
      [dbo].[Battles] 

     INNER JOIN Armies on Army1 = Armies.ArmyNum 

     Where 
      WDL=2 and Home=1 -- represents a "Win" 
     Group By 
      Member, ArmyMnemonic, Army, WDL 
    ) rnk 
    where rnk.ranks <= 3 
) src 
PIVOT (sum(ranks) for ArmyMnemonic in([Be],[Br],[DoC],[DE],[Dw],[HE],[Li],[OK],[OG],[Sk],[TE],[TK],[VC],[WoC],[WE])) as pvt 

ORDER BY Wins Desc; 
+0

@FranzSigmar請看我的編輯,有兩種方法來執行這個過濾器 – Taryn

+0

我剛剛測試過它,並且完美地工作。非常感謝@bluefleet,感謝您的幫助。 –

+0

@FranzSigmar高興地幫助。:) – Taryn

0

裹所有內的另一個選擇語句:

SELECT TOP 3 * FROM(

SELECT * 
FROM 
    (
    SELECT 
     RANK() over(Partition by ArmyMnemonic Order by COUNT(WDL) desc, Member) as ranks, ArmyMnemonic, Army, Member, 
     COUNT(WDL) as Wins 
    FROM 
     [dbo].[Battles] 

    INNER JOIN Armies on Army1 = Armies.ArmyNum 

    Where 
     WDL=2 and Home=1 -- represents a "Win" 
    Group By 
     Member, ArmyMnemonic, Army, WDL 
    ) as rnk 

PIVOT (sum(rnk.ranks) for ArmyMnemonic in([Be],[Br],[DoC],[DE],[Dw],[HE],[Li],[OK],[OG],[Sk],[TE],[TK],[VC],[WoC],[WE])) as pvt 

)數據 ORDER BY勝率說明

+0

我收到以下錯誤: - 消息1033,級別15,狀態1,行24 ORDER BY子句在視圖,內聯函數,派生表,subq中無效ueries和公用表表達式,除非還指定了TOP或FOR XML。 –

+0

我已將訂單移至括號外 – twoleggedhorse

1

我已經增加了一個額外的subquerying級別,以便可以應用一個簡單的WHERE子句

SELECT * 
FROM 
    (SELECT * FROM (--Subquery start 
    SELECT 
     RANK() over(Partition by ArmyMnemonic Order by COUNT(WDL) desc, Member) as ranks, ArmyMnemonic, Army, Member, 
     COUNT(WDL) as Wins 
    FROM 
     Battles 

    INNER JOIN Armies on Army1 = Armies.ArmyNum 

    Where 
     WDL=2 and Home=1 -- represents a "Win" 
    Group By 
     Member, ArmyMnemonic, Army, WDL 

    ) t where t.ranks <= 3 --New WHERE clause 

    ) as rnk 
PIVOT (sum(rnk.ranks) for ArmyMnemonic in([Be],[Br],[DoC],[DE],[Dw],[HE],[Li],[OK],[OG],[Sk],[TE],[TK],[VC],[WoC],[WE])) as pvt 
ORDER BY Wins Desc; 
+0

我試過但收到此錯誤: - 消息4104,級別16,狀態1,行22 多部分標識符「rnk.ranks」無法綁定。 –

+0

@FranzSigmar - 您可以添加表定義(作爲CREATE TABLE到您的問題然後請 –

+0

@Damien_The_Unbeliever你不能在'WHERE'子句中調用'rnk.ranks',因爲它在'SUM() 「PIVOT」的區域 – Taryn