2013-07-10 2 views
2

Используемый мной код дает мне правильную информацию, основанную на дате в предложении where. Я хочу иметь ту же информацию о других датах. Теперь я должен сам изменить дату и запустить код, скопировать/вставить его в другое место и начать сначала с новой даты. Это занимает много работы, если я хочу получать информацию за каждый день года. Возможно ли автоматическое изменение даты в предложении where, и что это лучший или простой способ сделать это?автоматически меняет переменную в том, где статья

Select t4.Count, t4.Status 
From(
    SELECT count(l.VoerID) as Count, l.Datum, l.Status, l.LogID 
     FROM (
      SELECT k.VoerID, k.Datum, MAX(k.LogID) AS LogID 
       FROM DB.LogStatus k 
       Where Datum < '2013-07-01' 
       GROUP BY k.VoerID 
      ) m 
     JOIN DB.LogStatus l 
     ON l.VoerID = m.VoerID AND l.LogID = m.LogID 
    Where status in ('B','IN1','IN2''V','Reserv') 
    Group by Status 
)t4 

EDIT:

исходная таблица (выбирается по одному VoerID) (таблица состоит из тысяч VoerID годов)

LogID Datum Идентификатор_пользователя Статус Время VoerID

1299772 2013-04- 17 259 N 14:09:11 50174

1319774 2013-05-23 68 B 11:19:17 50174

1320038 2013-05-23 197 IN1 16:53:30 50174

1322002 2013-05-28 68 IN2 09:22:32 50174

1325052 2013-05-31 161 G 9:00 : 59 50174

1325166 2013-05-31 10 400 09:15:12 50174

1325182 2013-05-31 10 V 09:30:07 50174

1325208 2013-05-31 10 V 09:45:06 50174

1325406 2013-05-31 10 Reserv 11:45:06 50174

1325522 2013-05-31 10 Reserv 12:15:06 50174

1325954 2013-05-31 10 Reserv 15:15: 13 50174

1328474 2013-06-05 10 Reserv 13:15:06 50174

1329230 2013-06-06 10 Reserv 09:45:03 50174

1329244 2013-06-06 10 архивации 10:00:08 50174

1329268 2013-06-06 10 архивации 10:15:08 50174

1330286 2013-06-07 10 архивации 10:15:06 50174

Я хочу теперь, что был статус из VoerID во все первые месяцы. поэтому на 2013-05-01 статус = N, на 2013-06-01 статус = Резерв и с 2013-07-01 он архивирован.

Так выше для одного VoerID.Я хочу, чтобы подсчитать количество пер VoerID в первый месяца, за последний LOGID до первого числа следующего месяца и в состоянии

Наконец, если я получаю информацию, я хочу, чтобы изменить его в MSExcel к Кросс и диаграммы:

1-1-2013 1-2-2013 1-3-2013 1-4-2013 1-5-2013

N 20 22 24 26 28

В 23 21,5 20 18 , 5 17

IN1 12 15 18 21 24

IN2 15 7 14 18 25

В 800 1000 1200 1400 1600

Reserv 50 63 76 89 102

архивации 100000 101220 102440 103660 104880

+1

Заканчивать этот вопрос: [For Loop в SQL] (http://stackoverflow.com/ Вопросы/6069024/for-loop-for-sql) – holbrookbw1

+0

@ holbrookbw1: thats не помогает ... им новичок в этом, поэтому я понятия не имею, как его закодировать – DBek

ответ

0

Выполнение перекрестного соединения всех дней в году, а затем группировки к этому дню.

Что-то вроде этого: -

SELECT COUNT(l.VoerID) as COUNT, m.aDate, l.Status 
FROM 
(
    SELECT Sub1.aDate, k.VoerID, MAX(k.LogID) AS LogID 
    FROM DB.LogStatus k 
    CROSS JOIN 
    (
     SELECT DATE_ADD('2013-01-01', INTERVAL units.i + tens.i * 10 + hundreds.i * 100 DAY) AS aDate -- return the first day of the year + all the numbers from 0 to 999 
     FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units -- Select units of days 
     CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens -- select tens 
     CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) hundreds -- select hundreds 
     WHERE DATE_ADD('2013-01-01', INTERVAL units.i + tens.i * 10 + hundreds.i * 100 DAY) <= '2013-12-31' -- limit the dates to the days of the specific year 
    ) Sub1 
    WHERE k.Datum < Sub1.aDate -- This should give up multiple copies of record, one for each date where the d Datum is less that that date 
    GROUP BY Sub1.aDate, k.VoerID -- GRoup by date and id, so getting the max log id for each date and id 
) m 
JOIN DB.LogStatus l 
ON l.VoerID = m.VoerID AND l.LogID = m.LogID -- Join where log it is the max log id 
WHERE status in ('x','y','z') 
GROUP BY m.aDate, Status 

EDIT - или за каждый месяц: -

SELECT COUNT(l.VoerID) as COUNT, m.aDate, l.Status 
FROM 
(
    SELECT Sub1.aDate, k.VoerID, MAX(k.LogID) AS LogID 
    FROM DB.LogStatus k 
    CROSS JOIN 
    (
     SELECT DATE_ADD('2013-01-01', INTERVAL units.i MONTH) AS aDate -- return the first day of each month of the year 
     FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11) units -- Select units of days 
    ) Sub1 
    WHERE k.Datum < Sub1.aDate -- This should give up multiple copies of record, one for each date where the d Datum is less that that date 
    GROUP BY Sub1.aDate, k.VoerID -- GRoup by date and id, so getting the max log id for each date and id 
) m 
JOIN DB.LogStatus l 
ON l.VoerID = m.VoerID AND l.LogID = m.LogID -- Join where log it is the max log id 
WHERE status in ('x','y','z') 
GROUP BY m.aDate, Status 
+0

, который, кажется, работает нормально. можете ли вы разбить код года, чтобы я мог узнать, что он делает? Я должен сказать, что код очень медленный, хотя из-за таблицы immens ... – DBek

+0

, поскольку код в день занимает много времени (потерянное соединение), можно изменить код для извлечения информации в первый день месяц? – DBek

+0

Обновлено, чтобы добавить несколько комментариев. Вы только когда-нибудь будете заниматься максимум 365 днями (т.е. годом)? Если это так, выбор для получения дат может получить меньший диапазон чисел и быть немного быстрее. – Kickstart

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