2016-09-02 122 views
1

努力爲SQL查詢添加額外步驟我想運行。SQL(子查詢)

我有一個客戶數據庫與當客戶加入的日期/時間的細節和交易表與他們多年

的交易細節的客戶表,我想什麼做的是組通過加入日期(以年爲單位),並計算每年加入的數量,然後在下一列中,然後計算在特定年份中進行了交易的人數。例如2016年是當年。這樣我可以顯示多年來客戶保留情況。

這兩張表格都是由客戶URN鏈接的,但我正在努力讓我的頭腦最有效地展現這一點。我可以很容易地統計和分組成員加入年份,我可以顯示最大日期交易,但我很努力將兩者結合在一起。我想我需要使用子查詢和左連接,但它暗指我。

實施例輸出的列標題與數據

Year_Joined = 2009

Joiner_Count = 10

Transact_in_2016 = 5

我在哪裏的語法,明智的。我知道這不是近乎完整的地方。因爲我需要通過DateJoined進行分組,然後子查詢2016年已完成交易的客戶數量?

SELECT Customer.URNCustomer, 
     MAX(YEAR(Customer.DateJoined)), 
     MAX(YEAR(Tran.TranDate)) As Latest_Tran, 
FROM Mydatabase.dbo.Customer 
LEFT JOIN Mydatabase.dbo.Tran 
    ON Tran.URNCustomer = Customer.URNCustomer 
GROUP BY Customer.URNCustomer 
ORDER BY Customer.URNCustomer 
+0

你想一個單一的一年? –

+0

是的,理想情況下。我希望加入的客戶有一年,然後統計當年的加入數量,然後計算加入該年的同一客戶的數量,但他們在2016年進行了交易。最終,我希望將此數字顯示爲保留百分比。例如。 2015年有35%的客戶在2016年進行了交易,等等。 –

回答

0

你可能想嘗試這樣的:只有在你的輸出

SELECT YEAR(Customer.DateJoined), 
    COUNT(Customer.URNCustomer), 
    COUNT(DISTINCT Tran.URNCustomer) AS NO_ACTIVE_IN_2016 
FROM Mydatabase.dbo.Customer 
LEFT Mydatabase.dbo.Tran 
    ON Tran.URNCustomer = Customer.URNCustomer 
    AND YEAR(Tran.TranDate) = 2016 
GROUP BY YEAR(Customer.DateJoined) 
+0

這工作,似乎比coalesce更容易遵循,但我要考慮我可以在哪裏應用其他答案。 –

2

最好的辦法是做聚合之前做連接。你想要計算兩種不同的東西,所以要單獨計算它們並將它們結合起來。

以下用途full outer join。這種處理那裏有幾年沒有新客戶,年都沒有交易的情況:

select coalesce(c.yyyy, t.yyyy) as yyyy, 
     coalesce(c.numcustomers, 0) as numcustomers, 
     coalesce(t.numtransactions, 0) as numtransactions 
from (select year(c.datejoined) as yyyy, count(*) as numcustomers 
     from Mydatabase.dbo.Customer c 
     group by year(c.datejoined) 
    ) c full outer join 
    (select year(t.trandate) as yyyy, count(*) as numtransactions 
     from database.dbo.Tran t 
     group by year(t.trandate) 
    ) t 
    on c.yyyy = t.yyyy; 
+0

嗨。感謝我喜歡這種方法,並沒有真正使用過煤塊,因此在使用中很方便。但是,我需要來自交易表的客戶數量,而不是所進行交易的數量(儘管您提供的內容很有用)。儘管它非常接近,我認爲我可以根據自己的需要進行調整。如果你確實想出一個改變你的答案,那麼我仍然很樂意被開悟。 –

+0

@MikeRobson。 。 。也許你想在這個子查詢中使用'count(distinct URNCustomer)'而不是'count(*)'。 –