2015-11-20 20 views
0

我有兩個表,我試圖建立一個查詢與我們的籌款部門,但我正在努力。使用SQL Server 2008.使用與另一列使用最大(列)的表> 0

Appeals表中包含關於哪些成員要發送捐款呼籲的數據。

Yearly_Gift表包含每年會員捐贈多少錢的數據。有時候,這張表可能會有一個特定年份的零美元金額。

我想要做的是使用這兩張表來提供有人捐贈的最後一年,以及捐贈的捐款額,如果它大於零,我們發出的呼籲。

這裏是表格和一些數據的簡化版本。我還包括我期望的輸出。誰能幫我這個?

--Build Tables 

CREATE TABLE [dbo].[Appeals](
    [Appeal_ID] [int] NOT NULL, 
    [Member_ID] [int] NOT NULL, 
CONSTRAINT [PK_Appeals] PRIMARY KEY CLUSTERED 
(
    [Appeal_ID] ASC, 
    [Member_ID] ASC 
)WITH (PAD_INDEX = OFF, 
STATISTICS_NORECOMPUTE = OFF, 
IGNORE_DUP_KEY  =  OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


CREATE TABLE [dbo].[Yearly_Gift](
    [Member_ID] [int] NOT NULL, 
    [FiscalYear] [char](4) NOT NULL, 
    [Amount] [money] NULL, 
CONSTRAINT [PK_Yearly_Gift] PRIMARY KEY CLUSTERED 
(
    [Member_ID] ASC, 
    [FiscalYear] ASC 
)WITH (PAD_INDEX = OFF, 
STATISTICS_NORECOMPUTE = OFF, 
IGNORE_DUP_KEY =  OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


--Fill tables 

INSERT INTO Appeals VALUES (1,101) 
INSERT INTO Appeals VALUES (1,102) 
INSERT INTO Appeals VALUES (2,101) 
INSERT INTO Appeals VALUES (2,102) 
INSERT INTO Appeals VALUES (2,103) 
INSERT INTO Appeals VALUES (2,104) 
INSERT INTO Appeals VALUES (2,105) 

INSERT INTO Yearly_Gift VALUES(101,'2015',100) 
INSERT INTO Yearly_Gift VALUES(102,'2014',0) 
INSERT INTO Yearly_Gift VALUES(102,'2012',150) 
INSERT INTO Yearly_Gift VALUES(102,'2011',200) 
INSERT INTO Yearly_Gift VALUES(103,'2013',500) 
INSERT INTO Yearly_Gift VALUES(103,'2014',500) 
INSERT INTO Yearly_Gift VALUES(104,'2012',200) 
INSERT INTO Yearly_Gift VALUES(104,'2015',100) 

所需的輸出

Appeal_ID Member_ID FiscalYear Amount 
2   101   2015  100 
2   102   2012  150 
2   103   2014  500 
2   104   2015  100 
2   105   NULL  NULL 

感謝您的幫助,您可以提供。

+0

爲什麼'101'有'上訴1和2'? –

+0

一個成員可以屬於很多上訴 – msmith11

回答

0
WITH X AS 
(
    SELECT A.[Appeal_ID], A.[Member_ID],Y.[FiscalYear], Y.[Amount] 
    FROM [dbo].[Appeals] A 
    LEFT JOIN [dbo].[Yearly_Gift] Y ON Y.[Member_ID] = A.[Member_ID] 
) 
SELECT X.[Appeal_ID], X.[Member_ID],Y.[FiscalYear], X.[Amount] 
FROM X 
LEFT JOIN (
    SELECT [Member_ID], 
    MAX([FiscalYear]) AS [FiscalYear] , 
    MAX([Appeal_ID]) AS [Appeal_ID] 
    FROM X 
    WHERE Amount > 0 
    GROUP BY X.[Member_ID] 
) Y ON X.Appeal_ID = Y.Appeal_ID AND X.Member_ID = Y.Member_ID AND X.FiscalYear = Y.FiscalYear 
WHERE Y.[FiscalYear] IS NULL AND X.[Amount] IS NULL OR Y.[FiscalYear] IS NOT NULL AND X.[Amount] IS NOT NULL 
ORDER BY X.Appeal_ID,X.Member_ID 
+0

這很好!謝謝你們每個人的幫助。 – msmith11

0

試試這個

Select a.Appeal_ID, a.Member_ID, y.FiscalYear, y.Amount 
    From Appeals a INNER JOIN Yearly_Gift y ON a.Member_ID = y.Member_ID 
    where y.Amount > 0 AND y.FiscalYear = 2014 
0
with cte as (
    SELECT Appeal_ID, A.Member_ID, FiscalYear, Amount, 
      row_number() over (partition by A.Member_ID order by FiscalYear DESC) as rn 
    FROM Appeals A 
    LEFT JOIN Yearly_Gift Y 
      ON A.Member_ID = Y.Member_ID 
) 
SELECT * 
FROM cte 
WHERE rn = 1 
    AND Amount <> 0 
0

好 - 這個查詢有點長/醜,但很有效。如果我有更多時間,我會考慮優化和代碼縮減。

SELECT 
    target_members.Appeal_ID, target_members.Member_ID, FiscalYear, Amount 
FROM 
    (
    SELECT 
     MAX(Appeal_ID) AS Appeal_ID, 
     Member_ID 
    FROM 
     Appeals 
    GROUP BY 
     Member_ID 
) AS target_members 
    LEFT OUTER JOIN (
    SELECT 
     MAX(Appeals.Appeal_ID) AS Appeal_ID, 
     Yearly_Gift.Member_ID, 
     Yearly_Gift.FiscalYear, 
     Yearly_Gift.Amount, 
     ROW_NUMBER() OVER (PARTITION BY Yearly_Gift.Member_ID ORDER BY FiscalYear DESC) AS r 
    FROM 
     Appeals, 
     Yearly_Gift 
    WHERE 
     Yearly_Gift.Member_ID = Appeals.Member_ID AND 
     Amount > 0 
    GROUP BY 
     Yearly_Gift.Member_ID, 
     Yearly_Gift.FiscalYear, 
     Yearly_Gift.Amount 
) AS last_donation 
    ON last_donation.Appeal_ID = target_members.Appeal_ID AND 
    last_donation.Member_ID = target_members.Member_ID AND 
    r = 1 
+0

該解決方案也適用。謝謝 – msmith11

0
 SELECT MAX(A.APPEAL_ID), A. MEMBER_ID, B. FISCAL_YEAR,B.AMOUNT 
     FROM XX_APPEALS A LEFT OUTER JOIN 
     (
     SELECT Y.MEMBER_ID, Y.FISCAL_YEAR, Y.AMOUNT 
     FROM XX_YEARLY_GIFT Y, -- select all columns in yearly_gift 
      (     -- that match the latest year per member 
      SELECT MEMBER_ID, MAX(FISCAL_YEAR) LATEST_YEAR 
      FROM XX_YEARLY_GIFT 
      GROUP BY MEMBER_ID --find latest year of giving per member 
      ) S 
      WHERE Y.MEMBER_ID = S.MEMBER_ID 
      AND Y.FISCAL_YEAR = S.LATEST_YEAR 
      ORDER BY Y.MEMBER_ID 
     ) B 
    ON A.MEMBER_ID = B.MEMBER_ID 
    GROUP BY A. MEMBER_ID, B. FISCAL_YEAR,B.AMOUNT 
    ORDER BY A.MEMBER_ID 

這也適用於通過最大的禮品報到,而不是最新的,或者彙報最近與recent_year,與largest_gift在一起。