2012-09-19 65 views
1

認識到我之前詢問的另一個問題可能太困難了,我正在改變我的要求。滿足標準的列表交易

我爲信用卡公司工作。我們的數據庫有一個客戶表和一個交易表。客戶表中的字段是SSN和CustomerKey。交易表中的字段是CustomerKey,交易日期(Transdate)和交易金額(TransAmt)。

我需要一個查詢,可以識別每個ssn在2012年的兩天時間內任何交易金額> 1000的總和。如果ssn在兩天期限內交易金額> 1000,我需要查詢返回全部該ssn的交易。

這裏是在事務表的原始數據的示例:

Trans#-----CustKey-----Date--------Amount 
1-----------12345----01/01/12--------$600 
2-----------12345----01/02/12--------$500 
3-----------67890----01/03/12--------$10 
4-----------98765----04/01/12--------$600 
5---------------04/02/12--------$600 
6---------------04/03/12--------$100 
7-----------13579----04/02/12--------$600 
8-----------24568----04/03/12--------$100

這裏是在客戶表的原始數據的示例:

CustKey-----SSN 
12345------123456789 
67890------123456789 
98765------987654321 
------987654321 
13579------246801357 
24568------246801357

下面是結果我需要:

Trans#------SSN---------Date---------Amount 
1--------123456789----01/01/12---------$600 
2--------123456789----01/02/12---------$500 
3--------123456789----01/03/12----------$10 
4--------987654321----04/01/12---------$600 
5--------987654321----04/02/12---------$600 
6--------987654321----04/03/12---------$100

正如你可以看到我的結果包括爲SSN 123456789 987654321和所有交易,並排除SSN 246801357.

+2

[你有什麼嘗試?](http://www.whathaveyoutried.com/) – SWeko

+1

你的查詢在哪裏? –

+0

這是我嘗試:選擇c.ssn,T * 從TransDtl牛逼 加盟客戶C上t.CustomerKey = c.CustomerKey JOIN(選擇c.ssn,SUM(t.TransAmt)作爲總 從TransDtl噸。 加入客戶C上t.CustomerKey = c.CustomerKey \t其中 '之間2012/1/4' 和 '2012年1月7日' \t和TransDtlKey <= t.transdtlkey \t通過c.ssn組t.postdate \t SUM(t.transamt)> 5000)x on x.ssn = c.SSN 其中t.postdate在'1/4/2012'和'1/7/2012'之間 – egerencher

回答

0

雖然你也許可以想出一個哈克的方式通過標準SQL來做到這一點,這是一個問題,國際海事組織更適合正在通過代碼解決(即而不是基於集合的邏輯/ SQL)。

如果您通過customerKey和日期對事務列表進行排序,然後循環訪問數據,則很容易解決。理想情況下,我會在代碼中這樣做,但也可以編寫存儲過程並使用循環和遊標。

1

這樣做的一種方法是在一年內每兩天翻閱一次。這裏是一個SQL Fiddle的例子。 的想法很簡單:

1)建立一個臨時表來存儲所有客戶選配

create table CustomersToShow 
(
    SSN int 
) 

2)循環通過一年填充臨時表與匹配量標準的客戶

declare @firstDayOfTheYear datetime = '1/1/2012'; 
declare @lastDayOfTheYear datetime = '12/31/2012'; 
declare @currentDate datetime = @firstDayOfTheYear; 
declare @amountThreshold money = 1000; 

while @currentDate <= @lastDayOfTheYear 
begin 
    insert into CustomersToShow(SSN) 
    select b.SSN 
    from transactions a 
     join customers b 
     on a.CustKey = b.CustKey 
    where TransactionDate >= @currentDate 
     and TransactionDate <= DATEADD(day, 2, @currentDate) 
    group by b.SSN 
    having SUM(a.TransactionAmount) >= @amountThreshold 

    set @currentDate = DATEADD(day,2,@currentDate) 
end 

3),然後只需選擇

select a.TransNumber, b.SSN, a.TransactionDate, a.TransactionAmount 
from transactions a 
    join customers b 
    on a.CustKey = b.CustKey 
    join CustomersToShow c 
    on b.SSN = c.SSN 

注意:這將是緩慢的...

0

這很容易,很適合基於集合的邏輯,如果你看看它的權利。您只需加入到您感興趣的每個日期範圍的表格中即可。每個T-SQL數據庫(Oracle有它內置)應該有一個多用途臺名爲integers - 這是非常有用的出奇的人往往:然後

CREATE TABLE integers (n smallint, constraint PK_integers primary key clustered (n)) 
INSERT integers select top 1000 row_number() over (order by o.id) from sysobjects o cross join sysobjects 

您的日期表如下所示:

SELECT dateadd(day, n-1, '2012') AS dtFrom, dateadd(day, n+1, '2012') AS dtTo 
from integers where n <= 366 

你可以然後(縮寫):

SELECT ssn, dtFrom 
FROM yourTables t 
    JOIN (SELECT dateadd(day, n-1, '2012') as dtFrom, dateadd(day, n+1, '2012') AS dtTo 
      from integers where n <= 366) d on t.date between d.dtFrom and d.dtTo 
GROUP BY ssn, dtFrom 
HAVING sum(amount) > 1000 

您可以選擇您的所有交易:

WHERE ssn in (SELECT distinct ssn from (<above query>) t) 
相關問題