2015-04-29 29 views
3

更新05/18/15如何根據列值獲取百分比?

在列上列有客戶名稱。我怎樣才能得到一個客戶每個日期的百分比?例如

CustomerName  Date 
    Sam    04/29/15 
    Joy    04/29/15 
    Tom    04/29/15 
    Sam    04/29/15 
    Oly    04/29/15 
    Joy    04/29/15 
        04/29/15 
    Sam    04/29/15 
        04/29/15 
    Sam    04/29/15 
    Oly    04/29/15 
    Sam    04/29/15 
    Oly    04/30/15 
    Joy    05/01/15 

發現我的列有12條,其中2個是空白,但他們不會指望的比例,只是有名字的人。我想知道Sam佔總數的百分比是多少(在這個例子中是10條記錄,所以Sam%是50)。

查詢應該返回

Date    Percentage 
04/29/15   50 
04/30/15   0 
05/01/15   0 

更新

我真的不關心其他的客戶,所以讓我們把他們當作一個。只需要知道總列表中Sam的百分比。

任何幫助將非常感激。由於

+0

是否有標識或主鍵可用?我們可以假設,日期對於所有受影響的行始終是相同的? – Marco

+0

當你說空白,你的意思是'空'或空的空間? – ughai

+0

當我說空白我的意思是空的空間@ughai,謝謝 – cojimarmiami

回答

2

每個人都好像是用子查詢或派生表。這應該表現良好,並且很容易遵循。試試看:

DECLARE @CustomerName VARCHAR(5) = 'Sam'; 

SELECT [Date], 
     @CustomerName AS CustomerName, 
     percentage = CAST(CAST(100.0 * SUM(CASE WHEN CustomerName = @CustomerName THEN 1 ELSE 0 END)/COUNT(*) AS INT) AS VARCHAR(20)) + '%' 
FROM @yourTable 
WHERE CustomerName != '' 
GROUP BY [Date] 

結果:

Date  CustomerName percentage 
---------- ------------ --------------------- 
2015-04-29 Sam   50% 
2015-04-30 Sam   0% 
2015-05-01 Sam   0% 
+0

讓我們把其他客戶當作一個客戶,我只需要按日期歸類的整個列表中Sam的百分比,謝謝 – cojimarmiami

+0

好吧,我想我現在明白了。 – Stephan

+0

獲取此錯誤'CONCAT'不是公認的內置函數名稱@Stephan。我正在運行sql server 2008 r2 – cojimarmiami

0

,你會做這樣的事情

SELECT (COUNT(*) * 100)/(SELECT COUNT(*) FROM Customer WHERE CustomerName <> '' AND Date = '04/29/15') 
FROM Customer 
WHERE CustomerName = 'Sam' 
    AND Date = '04/29/15' 

如果你想獲得count每日期,你可以使用這個

SELECT T.Date,((ISNULL(CustomerCount,0) * 100)/TotalCount) 
FROM 
(
SELECT COUNT(*) as TotalCount,Date 
FROM Customer 
WHERE CustomerName <> '' 
GROUP BY Date 
)T 
LEFT JOIN 
(
SELECT COUNT(*) 
FROM Customer 
WHERE CustomerName = 'Sam' 
GROUP BY Date 
)C 
ON T.Date = C.Date 
0

你可以試試這個:

select name, date, (100.0 * count(*))/
    (select count(*) from table t2 
    where name is not null and name <> '' and t2.date = t1.date) 
from table t1 
where name is not null and name <> '' 
group by name, date 
0

對於所有用戶

SELECT 
     (COUNT(*) * 100)/(SELECT COUNT(*) FROM Customer WHERE CustomerName <> '') as [percent], 
     CustomerName 
    FROM Customer group by CustomerName 
爲specifice用戶

SELECT 
    (COUNT(*) * 100)/(SELECT COUNT(*) FROM Customer WHERE CustomerName <> '') as [percent], 
    CustomerName 
FROM Customer where CustomerName ='Sam' 
+0

OP要求「每個日期有一個客戶」。所以'count(*)'不是我認爲的一個選項 – Andomar

1

你可以計算出在子查詢每人+天數:

select Date 
,  CustomerName 
,  100.0 * cnt/sum(cnt) over (partition by date) 
from (
     select Date 
     ,  CustomerName 
     ,  count(*) cnt 
     from table1 
     where CustomerName <> '' 
     group by 
       Date 
     ,  CustomerName 
     ) t1 

此打印:

Date     CustomerName 
----------------------- ------------ --------------------------------------- 
2015-04-29 00:00:00.000 Joy   20.000000000000 
2015-04-29 00:00:00.000 Oly   20.000000000000 
2015-04-29 00:00:00.000 Sam   50.000000000000 
2015-04-29 00:00:00.000 Tom   10.000000000000 

(4 row(s) affected) 
+0

我怎樣才能讓這個工作只爲山姆,我並不關心其他客戶。只需要知道薩姆代表@Andomar的百分比,謝謝 – cojimarmiami