2013-10-03 40 views
1

假設有activities表包含兩列:字符串actioncreated_at時間戳。行動欄visitsignup中只有兩個可能的值。使用SQL計算轉換

我想查看每天每次訪問的註冊數量的百分比。像:

Date  | Conversion 
-------------------------- 
2013-01-01 | 30% 
2013-01-02 | 27% 
2013-01-03 | 15% 
2013-01-04 | 22% 

是否有可能使用單個SQL查詢?

+0

你只是想在SELECT語句中看到或要在表存儲該是這樣的:在SQL Server 2008及更高版本,它可以與鑄造到date類型的更清潔,更高效的操作來代替 –

回答

1

對於SQL服務器,這應該工作:

SELECT coalesce(v.y, s.y) y, coalesce(v.m, s.m) m, coalesce(v.d, s.d) d, 
    100.0 * isnull(s.num, 0)/(isnull(s.num, 0) + isnull(v.num, 0)) conversion 
FROM 
(
    SELECT datepart(YEAR, [date]) y, datepart(m, [date]) m,datepart(d, [date]) d, 
     count(action) num 
    FROM actions 
    WHERE action = 'visit' 
    GROUP BY datepart(YEAR, [date]), datepart(m, [date]), datepart(d, [date]) 
) v 
FULL OUTER JOIN 
(
    SELECT datepart(YEAR, [date]) y, datepart(m, [date]) m,datepart(d, [date]) d, 
     count(action) num 
    FROM actions 
    WHERE action = 'signup' 
    GROUP BY datepart(YEAR, [date]), datepart(m, [date]), datepart(d, [date]) 
) s 
ON v.y = s.y AND v.m = s.m AND v.d = s.d 

我離開字符串連接,四捨五入和一般魯棒性的練習。

+0

Sql小提琴[here](http://sqlfiddle.com/#!3/77a2f/1) – PHeiberg

0

如果這是SQL Server的2005+,你可以試試下面的辦法:

SELECT 
    Date, 
    Conversion = signup * 100.0/(signup + visit) 
FROM (
    SELECT 
    Date = DATEADD(DAY, DATEDIFF(DAY, 0, created_at), 0), 
    action 
    FROM activities 
) AS a 
PIVOT (
    COUNT(action) FOR action IN (visit, signup) 
) AS p 
; 

Date表達剝去created_at戳斷時間的一部分。

Date = CAST(created_at AS date)