[英]mysql: count number of values in each group
我有一個問題:
SELECT
count(session_id_open) as opens,
count(session_id_visit) as visits,
date_intervals_open,
group_concat(date_intervals_visit)
FROM
bla
GROUP BY date_intervals_open
我得到了下表。 我需要的是找出group_concat中出現的每個值出現的百分比。 所以,基本上,我需要計算每個組中的值的數量(date_intervals_visit)(data_intervals_open)
opens visits date_intervals_open group_concat
213 5 day (12-16) evening (17-21),evening (17-21),day (12-16),day (12-16),day (12-16)
113 0 evening (17-21) NULL
11 0 late evening (22-00) NULL
396 12 morning (5-11) morning (5-11),morning (5-11),morning (5-11),morning (5-11),morning (5-11),morning (5-11),morning (5-11),morning (5-11),morning (5-11),morning (5-11),morning (5-11),morning (5-11)
9 0 night (1-4) NULL
這大約是我需要獲得的表格。 在第一個記錄的晚上有40,因為“晚上(17-21)”出現兩次,所有出現的次數是5. 2/5 * 100 = 40
opens visits date_intervals_open evening(17-21) day(12-16) morning (5-11)
213 5 day (12-16) 40 60 0
113 0 evening (17-21) NULL NULL NULL
11 0 late evening (22-00) NULL NULL NULL
396 12 morning (5-11) 0 0 100
9 0 night (1-4) NULL
PS:我使用group_concat只是想象我在那里的價值。 我不必使用它,因為之后解析它將是一個額外的努力。
你基本上需要一個樞軸,進行一些進一步的計算。 我的答案的基礎來自以下關於MySQL中的轉軸記錄的優秀SO主題。 我假設你有一個固定數量的date_intervals_visit
值,因為這些值似乎涵蓋了整天,因此我使用具有固定計數的條件計數方法。 我將在示例代碼中添加2個類別,您可以將其擴展為涵蓋所有date_intervals_visit
值。
SELECT
count(session_id_open) as opens,
count(session_id_visit) as visits,
date_intervals_open,
round(sum(if(date_intervals_visit='morning (5-11)',1,0)) / count(session_id_visit) * 100,2) as `morning (5-11)`,
round(sum(if(date_intervals_visit='day (12-16)',1,0)) / count(session_id_visit) * 100,2) as `day (12-16)`
FROM
bla
GROUP BY date_intervals_open
如果date_intervals_open
值可能有0次訪問,那么您需要在表達式中檢查0:
if(count(session_id_visit)=0, 0, <above formula>)
SELECT
count(session_id_open) as opens,
@visits := count(session_id_visit) as visits,
date_intervals_open,
ROUND(100 * SUM(date_intervals_visit = 'evening(17-21)') / @visits) AS 'evening(17-21)',
ROUND(100 * SUM(date_intervals_visit = 'day (12-16)') / @visits) AS 'day (12-16)',
ROUND(100 * SUM(date_intervals_visit = 'morning (5-11)') / @visits)'morning (5-11)',
FROM
bla
GROUP BY date_intervals_open
使用這樣的函數:
CREATE FUNCTION [dbo].[fn_SplitString](
@InputStr varchar(Max),
@Seperator varchar(10))
RETURNS @OutStrings TABLE (ItemNo int identity(1,1), Item varchar(256))
AS
BEGIN
DECLARE @Str varchar(2000),
@Poz int, @cnt int
--DECLARE @OutStrings TABLE (Item varchar(2000))
SELECT @Poz = CHARINDEX (@Seperator, @InputStr), @cnt = 0
WHILE @Poz > 0 AND @cnt <= 10000
BEGIN
SELECT @Str = SubString(@InputStr, 1, @Poz - 1)
INSERT INTO @OutStrings(Item) VALUES(@Str)
SELECT @InputStr = Right(@Inputstr, Len(@InputStr) - (len(@Str) + len(@Seperator)))
SELECT @Poz = CHARINDEX (@Seperator, @InputStr), @cnt = @cnt + 1
END
IF @InputStr <> ''
BEGIN
INSERT INTO @OutStrings(Item) VALUES(@InputStr)
END
RETURN
END
通過以下方式:
SELECT opens,
visits,
date_intervals_open,
[evening(17-21)]/[All]*100 AS [evening(17-21)],
[day(12-16)]/[All]*100 AS [day(12-16)],
[morning (5-11)]/[All]*100 AS [morning (5-11)]
FROM
(
SELECT
count(session_id_open) as opens,
count(session_id_visit) as visits,
date_intervals_open,
(SELECT COUNT(Item) FROM [dbo].[fn_SplitString](LTRIM(RTRIM(group_concat(date_intervals_visit))), ',') WHERE item = 'evening(17-21)') AS [evening(17-21)],
(SELECT COUNT(Item) FROM [dbo].[fn_SplitString](LTRIM(RTRIM(group_concat(date_intervals_visit))), ',') WHERE item = 'day(12-16)') AS [day(12-16)],
(SELECT COUNT(Item) FROM [dbo].[fn_SplitString](LTRIM(RTRIM(group_concat(date_intervals_visit))), ',') WHERE item = 'morning (5-11)') AS [morning (5-11)],
(SELECT COUNT(Item) FROM [dbo].[fn_SplitString](LTRIM(RTRIM(group_concat(date_intervals_visit))), ',')) AS [All]
FROM
bla
GROUP BY date_intervals_open
)blabla
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.