За последние 24 часа нас посетили 17615 программистов и 1617 роботов. Сейчас ищут 2002 программиста ...

нужно ли объединять таблицу саму с сабой?

Тема в разделе "MySQL", создана пользователем kanapus, 23 май 2009.

  1. kanapus

    kanapus Активный пользователь

    С нами с:
    10 мар 2009
    Сообщения:
    34
    Симпатии:
    0
    Есть таблица table:

    ID|мероприятие|ФИО|организация|этап|

    1........ a............... fio1 ..........x............ 1
    2........ a............... fio1 ..........x............ 2
    3........ a............... fio2 ..........y ........... 3
    4........ b............... fio3 ..........z............ 1
    5........ b................fio3 ..........z.............3

    Необходимо узнать количество мероприятий которыми занималась организация, которая не инициировала мероприятие (этап <> 1) и сгрупировать по ФИО.

    [sql]SELECT SUM(CASE WHEN t1.организация <> t2.организация THEN 1 ELSE END) FROM table t1 INNER JOIN ( SELECT *, MAX(ID) FROM table t2 GROUP BY мероприятие )t2 ON t2.мероприятие= t1.мероприятие AND t2.MAX(ID) = t1.ID[/sql]

    Кто-нибудь может предложить вариант попроще?
     
  2. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    select организация, count(*), max(ФИО) from table where этап <> 1 group by организация
     
  3. kanapus

    kanapus Активный пользователь

    С нами с:
    10 мар 2009
    Сообщения:
    34
    Симпатии:
    0
    :?:
    Наверное, я плохо изложил задачу. Нужно сравнить две организации (на первом и последнем этапе в рамках одного мероприятия), если они разные, то считаем количество.
     
  4. kanapus

    kanapus Активный пользователь

    С нами с:
    10 мар 2009
    Сообщения:
    34
    Симпатии:
    0
    [sql]SELECT s.fam, s.name, s.otch,

    (SUM(
    CASE WHEN mt.meroprID=1 AND fh1.statusID =17
    THEN 1
    END ) + SUM(
    CASE WHEN mt.meroprID=1 AND fh2.filialID = fh1.filialID
    AND fh2.doID = fh1.doID
    AND fh2.otdelID = fh1.otdelID
    THEN 0
    ELSE 1
    END ) + SUM(
    CASE WHEN mt.meroprID=1 AND IF( (
    fh2.filialID = fh1.filialID
    AND fh2.doID = fh1.doID
    AND fh2.otdelID = fh1.otdelID
    ), 0, 1 )
    AND fh1.statusID =17
    THEN 1
    END )) AS ball1,

    (SUM(
    CASE WHEN mt.meroprID=2 AND fh1.statusID =17
    THEN 1
    END ) + SUM(
    CASE WHEN mt.meroprID=2 AND fh2.filialID = fh1.filialID
    AND fh2.doID = fh1.doID
    AND fh2.otdelID = fh1.otdelID
    THEN 0
    ELSE 1
    END ) + SUM(
    CASE WHEN mt.meroprID=2 AND IF( (
    fh2.filialID = fh1.filialID
    AND fh2.doID = fh1.doID
    AND fh2.otdelID = fh1.otdelID
    ), 0, 1 )
    AND fh1.statusID =17
    THEN 1
    END )) AS ball2,

    (SUM(
    CASE WHEN mt.meroprID=3 AND fh1.statusID =17
    THEN 1
    END ) + SUM(
    CASE WHEN mt.meroprID=3 AND fh2.filialID = fh1.filialID
    AND fh2.doID = fh1.doID
    AND fh2.otdelID = fh1.otdelID
    THEN 0
    ELSE 1
    END ) + SUM(
    CASE WHEN mt.meroprID=3 AND IF( (
    fh2.filialID = fh1.filialID
    AND fh2.doID = fh1.doID
    AND fh2.otdelID = fh1.otdelID
    ), 0, 1 )
    AND fh1.statusID =17
    THEN 1
    END )) AS ball3

    FROM `fhase_history` fh1
    INNER JOIN (

    SELECT * , max( fhase_historyID ) AS max
    FROM fhase_history
    WHERE date_format( date_close, '%Y-%m-%d' ) > current_date - INTERVAL 30
    DAY GROUP BY map_targetID
    )fh2 ON fh2.map_targetID = fh1.map_targetID
    AND fh2.max = fh1.fhase_historyID
    LEFT JOIN sotrudnik s ON s.sotrudnikID=fh1.sotrudnikIDclose
    LEFT JOIN map_target mt ON mt.map_targetID=fh1.map_targetID
    WHERE fh1.filialID = '1'
    AND fh1.doID = '10'
    AND fh1.otdelID = '3'
    GROUP BY fh1.sotrudnikIDclose
    ORDER BY ball6 DESC
    LIMIT 5 [/sql]

    Можно ли в mysqlем сложить все баллы? Можно ли упростить запрос?