Ответы пользователя по тегу SQL
  • Как составить сложный запрос?

    WStanley
    @WStanley
    Back-end Developer
    Непонятно почему у тебя в таблицу employee есть и id и employee_id, привожу запрос в котором appointment.employee_id = employee.id и позволил себе предположить что в таблице employee есть поле name
    Есть нюанс, этот запрос покажет сотрудников у кот есть клиенты не более трех записанных именно на 09:00, если у этого же сотрудника есть еще два клиента(т.е. общее число клиентов 5) на 14:00 то он(сотрудник) тоже будет показан, но только с клиентами на 9:00 т.к. группировка есть по времени, надеюсь понятно написал
    SELECT
        EMPLOYEE.ID
    ,   EMPLOYEE.NAME
    FROM
        EMPLOYEE
    LEFT OUTER JOIN
        APPOINTMENT
    ON
        EMPLOYEE.ID =   APPOINTMENT.EMPLOYEE_ID
    GROUP BY
        EMPLOYEE.ID
    ,   EMPLOYEE.NAME
    ,   APPOINTMENT.START_TIME
    HAVING
        (COUNT(APPOINTMENT.EMPLOYEE_ID) <=  3)
    AND (APPOINTMENT.START_TIME =   CONVERT(TIME, '09:00:00', 114))
    Ответ написан
  • Джойним 3 таблицы sql, как?

    WStanley
    @WStanley
    Back-end Developer
    В общем если id в 1 таблице это id из 3 то так можно:
    SELECT
        3TABLE.ID
        -- Вычисляем скидку
    ,   CASE
            WHEN
                TIMES   >   2
            THEN
                '20'
            ELSE
                '5'
        END             AS  DISCOUNT
    FROM
        3TABLE
    LEFT OUTER JOIN
        (
            -- Группируем по ИД
            -- Суммируем sales
            -- Берем более 1500
            SELECT
                ID
            ,   SUM(SALES)  AS  SALES
            FROM
                (
                    -- Выбираем Samara и Barcelona
                    -- Исключаем England
                    -- Группируем (хотя, вот здесь наверное можно не группировать)
                    SELECT
                        1TABLE.ID
                    ,   SUM(1TABLE.SALES) AS  SALES
                    FROM
                        1TABLE
                    INNER JOIN
                        2TABLE
                    ON
                        1TABLE.CITY   =   2TABLE.CITY
                    GROUP BY
                        1TABLE.ID
                    ,   1TABLE.CITY
                    ,   2TABLE.COUNTRY
                    ,   1TABLE.SALES
                    HAVING
                        (1TABLE.CITY  IN  (N'Samara', N'Barcelona'))
                    AND (NOT    (
                            2TABLE.COUNTRY    =   N'England'
                        ))
                )   AS  WRAP_TABLE
            GROUP BY
                ID
            HAVING        (SUM(sales) > 1500)
        )   AS  SUM_WRAP_TABLE
    ON
        SUM_WRAP_TABLE.ID   =   3TABLE.ID
    Ответ написан
    Комментировать
  • Как вытащить данные из таблицы по данным из where другой таблицы?

    WStanley
    @WStanley
    Back-end Developer
    У тебя написано
    SELECT *    # - выбрать все *(звездочка)
    FROM items    # - из таблицы items
    WHERE   # - где
    prise >   # - цена prise больше(пишется price правильно) 
    (			
       # Этот подзапрос вернет число которое сверяется с prise			
    	SELECT sell_prise   # - выбрать sell_prise (sell_priсe правильно)
    	FROM results    # - из таблицы results
    	WHERE items_id = 1  # - где items_id (в таблице results) = 1
    ) 
    AND id = 1;    # - и id (в таблице items ) = 1

    Что значит первую заменить на обращение ко второй?
    .
    Ответ написан
  • Как выгрузить group_concat-ом перечень id?

    WStanley
    @WStanley
    Back-end Developer
    В select добавить
    GROUP_CONCAT(A.ACTID)

    SELECT
        CASE WHEN P.PRODUCTID !=  '' THEN P.PRODUCTNAME WHEN L.LICENSEID !=  '' THEN L.NAME ELSE S.SERVICENAME END AS  PRODUCTNAME
    ,   CASE WHEN P.PRODUCTID !=  '' THEN 'product' WHEN L.LICENSEID !=  '' THEN 'license' ELSE 'service' END      AS  TYPE
    ,   SUM(INV.QUANTITY)                                                                                          AS  QUANTITY
    ,   SUM(INV.QUANTITY*INV.LISTPRICE*(1-COALESCE(INV.DISCOUNT_PERCENT, 0)/100)-COALESCE(INV.DISCOUNT_AMOUNT, 0))  AS  SUBTOTAL
    ,   GROUP_CONCAT(A.ACTID)
    FROM
        VTIGER_SP_ACT   A
    INNER JOIN
        VTIGER_CRMENTITY    E
    ON
        E.CRMID =   A.ACTID
    INNER JOIN
        VTIGER_INVENTORYPRODUCTREL  INV
    ON
        INV.ID  =   A.ACTID
    LEFT JOIN
        VTIGER_PRODUCTS P
    ON
        P.PRODUCTID =   INV.PRODUCTID
    LEFT JOIN
        VTIGER_SERVICE  S
    ON
        S.SERVICEID =   INV.PRODUCTID
    LEFT JOIN
        VTIGER_LICENSE  L
    ON
        L.LICENSEID =   INV.PRODUCTID
    WHERE
        E.DELETED           =       FALSE
    AND ACTDATE             BETWEEN '$from_date'    AND '$to_date'
    AND A.BRANCH_OR_AGENT   IN      ($branches)
    GROUP BY
        1
    ,   2
    Ответ написан
    5 комментариев
  • Как мне решить задачу?

    WStanley
    @WStanley
    Back-end Developer
    Трям!
    Сначала пишем запрос который суммирует нам все QUANTITY по полю ORDERID
    SELECT ORDERID, SUM(QUANTITY) AS QUANTITY FROM [ORDERDETAILS] GROUP BY ORDERID

    Теперь нам надо выбрать те записи в которых QUANTITY > 200 следовательно надо обернуть наш запрос и добавить условие
    SELECT
        TABLE_SUM_QNT.ORDERID
    ,   TABLE_SUM_QNT.QUANTITY
    FROM
        (
            SELECT
                ORDERID
            ,   SUM(QUANTITY)   AS  QUANTITY
            FROM
                [ORDERDETAILS]
            GROUP BY
                ORDERID
        )   AS  TABLE_SUM_QNT
    WHERE
        TABLE_SUM_QNT.QUANTITY >   200
    Ответ написан
    Комментировать
  • Объясните, как работают несколько left join?

    WStanley
    @WStanley
    Back-end Developer
    Доброго!
    Оценок у одной книги может быть несколько, жанров как я понял тоже, вот строки и задваиваются, чтобы увидеть это просто уберите группиворку и выполните запрос. Это поможет понять что происходит. А лучше уберите группировку и по очереди джойните таблицы анализируя результат, все станет понятно.

    Если на пальцах объяснять то к каждому id книги будут прикреплены все оценки этой книги
    book | rating
    ---------------
     1   |    4
     1   |    5

    Если вы джойните еще одну таблицу то картина будет примерно такой
    book | rating | gename
    ----------------------
      1   |  4    |  g1
      1   |  4    |  g2
      1   |  5    |  g1
      1   |  5    |  g2

    Соответственно после группировок у вас:
    book | rating | gename
    ----------------------
      1   |  4.5    |  g1, g2, g1, g2

    А чтоб решить проблему используйте GROUP_CONCAT_DISTINCT
    Он исключит повторяющиеся значения
    book | rating | gename
    ----------------------
      1   |  4.5    |  g1, g2

    p.s. В любой непонятной ситуации убирай группировку
    Ответ написан
    1 комментарий
  • Как продолжить выборку?

    WStanley
    @WStanley
    Back-end Developer
    Трям!
    Джойны не так страшны как кажутся, тут главное практика.
    SELECT
        USERS.LOGIN
    ,   NEWS.TITLE
    ,   NEWS.TEXT
    FROM
        USERS
    LEFT OUTER JOIN
        COMMENTS
    ON
        USERS.ID    =   COMMENTS.USER_ID
    RIGHT OUTER JOIN
        NEWS
    ON
        USERS.ID    =   NEWS.USER_ID
    GROUP BY
        NEWS.TITLE
    ,   NEWS.TEXT
    ,   USERS.LOGIN
    HAVING
        (COUNT(COMMENTS.ID) >   1)

    p.s. Чтобы научиться писать запросы надо писать запросы.
    Ответ написан