2013-11-14 3 views
0

Трудно объяснить словами, но я пытаюсь получить данные, сгруппированные по типу и соединенные другой таблицей, чтобы получить результаты.Результаты MySQL для подсчета одинакового значения поля в сгруппированном запросе

Вот мой пример SqlFiddle.

Ниже приведен пример данных:

(ссылка таблица) [идентификатор, тип, созданный]

(1, 1, '2013-01-01') 
(2, 1, '2013-01-02') 
(3, 2, '2013-01-03') 
(4, 4, '2013-01-04') 

(Информация таблица) [идентификатор, link_id, Тип_информации, подсчет, тик]

(1, 1,1,10,15) 
(1, 2,2,20,17) 
(1, 3,1,12,14) 
(1, 4,2,18,21) 

результаты я хочу это: [type_a, type_b, Tally, тик]

(1, 1, 30, 32) 
(1, 0, 12, 14) 
(0, 1, 18, 21) 

Результаты я получаю

(2, 2, 30, 32) 
(1, 1, 12, 14) 
(1, 1, 18, 21) 

Вот мой запрос я использую

SELECT 
    COUNT(i.info_type) as type_a, 
    COUNT(i.info_type) as type_b, 
    SUM(i.tally) as tally, 
    SUM(i.tick) as tick 
FROM link l 
JOIN info i ON (l.id = i.link_id) 
WHERE l.created BETWEEN '2013-01-01' AND '2014-01-01' 
GROUP BY l.type 

Подведем Я хочу, чтобы получить все ссылки в диапазоне дат, группировка по link.type затем возвращаются счетчик info_type, равный 1 как type_a и равный 2 как type_b , и сумма счетчика и отметки, которая является правильной. Это только значения типа_a и type_b , которые ошибочны.

+0

Данные в таблице «link» находятся только в 2 столбцах, в то время как ваше описание имеет значение 3. –

+0

Я делаю эти исправления. Я вижу, что, возможно, допустил ошибку и пропустил несколько полей. Спасибо, что указали это. – John

+0

Исправлено это тоже. Благодарю. – John

ответ

1
SELECT 
    SUM(i.info_type = 1) AS type_a, 
    SUM(i.info_type = 2) AS type_b, 
    SUM(i.tally) AS tally, 
    SUM(i.tick) AS tick 
FROM link l 
JOIN info i ON l.id = i.link_id 
WHERE l.created BETWEEN '2013-01-01' AND '2014-01-01' 
GROUP BY l.type ; 

SUM(i.info_type = 1) является идиомой MySQL. Более читаемый код SQL будет:

SELECT 
    COUNT(CASE WHEN i.info_type = 1 THEN 1 ELSE NULL END) AS type_a, 
    COUNT(CASE WHEN i.info_type = 2 THEN 1 ELSE NULL END) AS type_b, 
    SUM(i.tally) AS tally, 
    SUM(i.tick) AS tick 
FROM link l 
JOIN info i ON l.id = i.link_id 
WHERE l.created BETWEEN '2013-01-01' AND '2014-01-01' 
GROUP BY l.type ; 

На другой ноте, я не думаю, что вы должны использовать BETWEEN с датами. Условие, как оно будет включать в себя целый год плюс один день, который, я сомневаюсь, может быть полезным. Вы можете использовать вместо:

WHERE l.created >= '2013-01-01' 
    AND l.created < '2014-01-01' -- notice the missing equal sign here 

, который приведет в интервале ровно один год, независимо от того, если created столбец типа DATE, DATETIME или TIMESTAMP.

0

Я полагаю, это то, что вам нужно

SELECT 
    SUM(CASE WHEN MOD(I.INFO_TYPE,2) = 0 THEN 1 ELSE 0 END) as type_B, 
    SUM(CASE WHEN MOD(I.INFO_TYPE,2) <> 0 AND MOD(I.INFO_TYPE, 1) = 0 
    THEN 1 ELSE 0 END) as type_A, 
SUM(I.TALLY) AS TALLY, SUM(I.TICK) AS TICK 
FROM link l 
JOIN info i ON (l.id = i.link_id) 
WHERE l.created BETWEEN '2013-01-01' AND '2014-01-01' 
GROUP BY L.TYPE 
+0

Нет type_a и type_b может быть 0, 2 и вести подсчет в зависимости от того, сколько из них возвращено, нет статических результатов. – John

+0

По мере роста таблицы он может давать большие результаты в каждой строке. Поскольку он сгруппирован по ссылке. Он просто подсчитывает, сколько в этой группе из info - это info_type 1 и 2, поэтому в группе может быть много, а type_a и type_b могут быть 0, 4, если запись отражает такие результаты. – John

+0

Вам нужны какие-либо изменения в запросе? Если да, то какая модификация вам нужна / – Santhosh

Смежные вопросы