2016-05-17 3 views
0

Я не уверен, какой правильный способ сформулировать этот вопрос, но я надеюсь, что это имеет смысл. У меня есть запрос:Считайте записи по кварталам по диапазону дат

SELECT 
    c.ID, 
    c.Name, 
    c.DateAdded, 
    c.LastContact 
FROM 
    computers AS c 
WHERE 
    LENGTH(DateAdded) > 1 
ORDER BY 
    DateAdded ASC; 

возвращающий:

ID Name DateAdded   LastContact 
1 MUTHER 9/2/2012 1:23  5/17/2016 13:57 
5 VGER 12/19/2012 10:44 5/17/2016 13:56 
7 HELPER 1/13/2013 18:09  5/17/2016 13:57 
9 JARVIS 1/15/2013 0:28  7/31/2015 0:20 
12 PHLFS1 1/17/2013 18:41  2/17/2013 13:37 

Я могу считать дату, когда компьютеры были добавлены Quarter с этим запросом:

SELECT 
    YEAR(DateAdded) AS YEAR, 
    QUARTER(DateAdded) AS QUARTER, 
    COUNT(ComputerID) AS 'added-during-qtr' 
FROM 
    computers 
WHERE 
    LENGTH(DateAdded) > 1 
GROUP BY 
    YEAR(DateAdded), 
    QUARTER(DateAdded) 
ORDER BY 
    YEAR(DateAdded), 
    QUARTER(DateAdded) 

что дает мне когда были активированы:

year quarter added-during-qtr 
2012 3  1 
2012 4  1 
2013 1  3 

Но НЕ, если они были активны в течение квартала или нет, что то, что я действительно ищу:

year quarter active-during-qtr 
2012 3  1 
2012 4  2 
2013 1  5 
2013 2  4 

Я не уверен, если я задать вопрос правильный путь или нет, но в конце дня, я хочу подсчитать количество компьютеров, которые были «активны» между DateAdded и LastContact, отсортированные по годам и кварталам. В идеале без необходимости вручную добавлять диапазоны в оператор case. Заранее спасибо.

+1

Как вы знаете, если компьютер был «активным» тогда? Есть ли еще один столбец, который вы не показываете в своем сообщении прямо сейчас, или он определен по-другому? Нужно знать эту информацию, чтобы помочь вам в решении вопроса. – Fuzzzzel

+0

Я думаю, что @Fuzzzzel. Должна быть «Деактивировать» колонку, а также другую мудрую я не могу объяснить, как после активации 5 компьютеров на 1 квартал 2013 года, а затем в следующем квартале только 4 –

+1

вы ищете ** 2013 2 4 **, но данных для 2013 нет -Q2 в вашем столе – Alex

ответ

0

До сих пор не может получить вашу логику, почему вы ожидаете что-то на 2-ом квартале 2013 года

Но вот моя попытка:

http://sqlfiddle.com/#!9/ce133d/7

SELECT 
    p.year, 
    p.quarter, 
    COUNT(DISTINCT c.id) 
FROM (
    SELECT 
    YEAR(DateAdded) AS YEAR, 
    QUARTER(DateAdded) AS QUARTER, 
    CONCAT(YEAR(DateAdded),QUARTER(DateAdded)) period 
    FROM computers 
    WHERE LENGTH(DateAdded) > 1 
    GROUP BY YEAR(DateAdded), QUARTER(DateAdded) 
    ORDER BY YEAR(DateAdded), QUARTER(DateAdded) 
) p #periods 
LEFT JOIN computers c 
ON p.period>=CONCAT(YEAR(c.DateAdded),QUARTER(c.DateAdded)) 
GROUP BY p.period 

Update Согласно вашим последним комментирует, что эти изменения могут быть сделаны:

http://sqlfiddle.com/#!9/0c323e/5

SELECT 
    p.year, 
    p.quarter, 
    COUNT(DISTINCT c.id) 
FROM (
    SELECT 
    y.year, 
    q.quarter, 
    CONCAT(y.year,q.quarter) period 
    FROM (SELECT 2012 AS year UNION SELECT 2013) y 
    LEFT JOIN (SELECT 1 AS quarter UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) q 
    ON 1 
) p #periods 
LEFT JOIN computers c 
ON p.period>=CONCAT(YEAR(c.DateAdded),QUARTER(c.DateAdded)) 
    AND p.period<=CONCAT(YEAR(c.LastContact),QUARTER(c.LastContact)) 
GROUP BY p.period 

и если вам нужно ограничить период вы можете добавить WHERE пункт перед тем, как это GROUP BY p.period:

WHERE p.period<='20132' 

http://sqlfiddle.com/#!9/0c323e/7

+0

В принципе, я пытаюсь отслеживать, проверен ли компьютер на нашем сервере в течение заданного диапазона. Если я добавлю их в 1/1/2015, и компьютер перестанет проверять на 4/15/2015, я бы посчитал это для Q1 и Q2, но это снизило бы мой счет за Q3. –

+0

Вы когда-нибудь читали, о чем я спрашивал? * Если я добавлю их на 1/1/2015 *, эта часть будет очень понятной. но в вашей выборке нет таких данных. Единственные периоды: «Q3-2012, Q4-2012 и Q1-2013» проверяют ваше сообщение. – Alex

+0

Спасибо, Алекс. Я прочитал то, что вы просили, и я думаю, что мой вопрос немного неясен. Запрос должен подсчитывать количество компьютеров, которые «проверены» в течение четверти. У меня есть дата начала регистрации, дата, когда они перестали проверяться, и квартал, в который я хочу проверить. Это результат Q2 в 2013 году, который я ищу. Только 4 компьютера проверялись между 4/1/2013 и 6/30/2013. –

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