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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ну если совсем влоб, то
    WITH cte AS (
      SELECT id, 
             num, 
             LAG(num) OVER (ORDER BY id) lag_num
      FROM test
    )
    SELECT id, 
           num,
           CASE WHEN num <> 0
                THEN SUM(CASE WHEN num <> 0 AND lag_num = 0 THEN 1 ELSE 0 END) OVER (ORDER BY id) 
                ELSE 0
                END [group]
    FROM cte

    Сработает неправильно, если самая первая запись ненулевая... ну это как-нить сам поправь. Мне лень.
    Ответ написан
  • В чём отличие составного и покрывающего индекса?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Составной индекс - это индекс по двум и более полям. А не по одному полю. Т.е. записи индекса сортированы по полю_1, если в нём одинаковые значения, то внутри группы с одинаковым значением они сортируются по полю_2, если и там одинаковые, то по полю_3...

    Покрывающий индекс - это индекс, в выражении которого присутствуют все использованные в запросе поля. То есть при выполнении запроса серверу вообще не нужна сама таблица, достаточно индекса, всё берётся прямо из него.

    Использование кластерного индекса - это обращение к самОй таблице. Даже если сортировка этого индекса никак не способствует выполнению запроса.
    Ответ написан
    Комментировать
  • Replace\CAST\ISNULL как применить?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT CASE WHEN [column] IS NULL
                THEN 'sale'
                WHEN CHARINDEX([column], '.') > 0
                THEN LEFT([column], CHARINDEX([column], '.') - 1)
                ELSE [column] 
                END AS [column] 
    FROM source_table;


    как есть 2-я таблица с такимеже значениями только без .0 и без NULL . А мне в дальнейшем нужно сравнить эти 2 таблицы


    Соответственно
    SELECT *
    FROM table1
    JOIN table2 ON table1.[column] = CASE WHEN table2.[column] IS NULL
                                          THEN 'sale'
                                          WHEN CHARINDEX(table2.[column], '.') > 0
                                          THEN LEFT(table2.[column], CHARINDEX(table2.[column], '.') - 1)
                                          ELSE table2.[column] 
                                          END;
    Ответ написан
    Комментировать
  • Насколько информация о MS SQL Server 2012 применима к актуальным версиям?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Во-первых, практически все версии SQL Server обратно совместимы. Т.е. всё, что было в предыдущей версии, поддерживается последующей. Если какие-то фичи удалены или изменены - это явно описано в соответствующем документе (который What's new).

    Во-вторых, поддерживаемые фичи определяются не только версией сервера, но и уровнем совместимости БД (compatibility level). Если уровень совместимости не поддерживал фичу - она не будет использоваться, даже если версия сервера позволяет. А если фича изменила поведение - её поведение будет определяться именно уровнем совместимости БД, а не версией СУБД. Любая версия сервера поддерживает определённый диапазон уровней совместимости - а потому изменение версии на 1-2 поколения вполне может производиться без длительного перелопачивания БД в новый формат (правда, и новые фичи могут быть недоступны).
    Ответ написан
    Комментировать
  • Почему не работает !=ALL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Правильно ругается. Документацию читать надо, а не сомнительные комментарии к ней.

    Выражение при использовании операторов ALL, SOME, ANY может быть только и исключительно набором данных, а не набором скалярных значений. Применительно к SQL Server - только подзапросом. Можно, конечно, попробовать использовать функцию, возвращающую набор данных, но сильно сомневаюсь, что получится.

    ALL (Transact-SQL)

    Так что синтаксически правильно так:
    Select * 
    from Employees
    where [Employee ID] != ALL ( SELECT 90 UNION SELECT NULL );

    Хотя и неправильно логически - наличие в списке NULL однозначно приведёт к пустому набору данных.
    Ответ написан
  • Как получить среднее значение с начала года на каждый день SQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *, AVG(RT) OVER (PARTITION BY Curr, YEAR(Dates) ORDER BY Dates) AS example
    FROM src_table
    Ответ написан
    Комментировать
  • MSSQL and mysql в чем отличие?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Но это такое убожество что я толком ничерта не понимаю

    Не надо путать причину и следствие. Причина - это что ты ни хрена не понимаешь. А следствие - оно тебе кажется убожеством.
    offtop
    В скобках отмечу, что если ты не только ни хрена не понимаешь, но и жалуешься на это, и считаешь это достаточным обоснованием того, чтобы назвать убожеством - то ты и не хочешь понимать, и не пытаешься понять. В смысле не пытаешься по-настоящему, прочтение пары страниц из мануала под этот термин не проходит.


    отличаются ли запросы sql MSSQL от Mysql

    Да. Точнее, самые простейшие базовые запросы могут выглядеть одинаково. Но не более, чуть только хоть какая-то сложность, и одинаковость заканчивается. Синтаксис различается, и весьма сильно. А кое-где даже подходы к решению задачи различаются, и код с одной СУБД на другую не адаптируется совсем - только полное переписывание.

    возможно ли сменить БД без нарушения функциональности софта.

    Если запросы хардкодом - крайне маловероятно. Если тексты запросов - ресурс, вероятность несколько выше. Если вся лигика находится на сервере, общение с ним выполняется исключительно обращением к представлениям и вызовом процедур, а само приложение является чистым интерфейсом - скорее всего возможно.
    Ответ написан
    Комментировать
  • Как распарсить строку?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS ( SELECT name, last_name, cnt FROM table
                  UNION ALL
                  SELECT name, last_name, cnt - 1 FROM cte WHERE cnt > 1 )
    SELECT name, last_name FROM cte;
    Ответ написан
    Комментировать
  • Как посчитать ФИО в колонках с неправильным порядком?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Пример реализации для MySQL 8+:
    WITH 
    cte1 AS ( SELECT id, col1 val FROM test UNION ALL 
              SELECT id, col2 FROM test UNION ALL
              SELECT id, col3 FROM test ),
    cte2 AS ( SELECT id, GROUP_CONCAT(val ORDER BY val) FIO
              FROM cte1 
              GROUP BY id )
    
    SELECT test.id, test.col1, test.col2, test.col3, GROUP_CONCAT(cte2_2.id) ids
    FROM test
    JOIN cte2 cte2_1 USING (id)
    JOIN cte2 cte2_2 USING (FIO)
    GROUP BY test.id, test.col1, test.col2, test.col3

    Вывод:

    id	col1		col2		col3		ids
    1	Иванов		Иван		Иванович	1,2
    2	Иван		Иванович	Иванов		1,2
    3	Петров		Сергей		Алексеевич	3,4,5
    4	Петров		Сергей		Алексеевич	3,4,5
    5	Сергей		Алексеевич	Петров		3,4,5
    DEMO

    Если нужна ещё и нормализация (т.е. строго в col1 сунуть фамилию, в col2 имя...) - наилучшим вариантом считаю загрузку справочников имён, отчеств и фамилий (вполне доступные справочники) и их использование для категорирования. 99% записей будут полностью обработаны по ним, а оставшийся десяток записей (где два или все три значения отсутствуют в справочниках) можно и вручную обработать, вернее, пополнить справочник, чтобы при втором запуске все 100% были распознаны и категорированы корректно.

    выполняться будет на MS SQL Server, версию не могу сказать.

    Для MS SQL вместо GROUP_CONCAT будет STRING_AGG(column) [WITHIN GROUP ( ORDER BY column)]. https://docs.microsoft.com/ru-ru/sql/t-sql/functio...
    Ответ написан
    3 комментария
  • Как настроить права в на запись для одного поля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Да, в SQL Server имеется column-level security. Так что возможно настроить требуемые права доступа.

    См. напр. https://docs.microsoft.com/ru-ru/sql/relational-da...
    Ответ написан
  • Как можно увеличить скорость запроса?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT TOP 500 * 
    FROM [table] 
    WHERE  NOT EXISTS ( SELECT NULL 
                        FROM [Entities] 
                        WHERE [column] = '2' 
                          AND [table1].[Id] = [ClientTableId] )


    PS. Наличие индекса Entities (column, ClientTableId) - приветствуется. Впрочем, может, Entities (ClientTableId, column) окажется лучше - зависит от статистики данных.

    PPS. TOP 500 без указания ORDER BY есть штука малоосмысленная.
    Ответ написан
    2 комментария
  • Почему сломались отчеты после миграции 1С с mssql на postgresql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SQL Server и PostgreSQL - две разные СУБД. И соответственно два разных диалекта (да, много общего, но и различий хватает). Запросы, работающие на одной СУБД, запросто могут поломаться при выполнении в другой СУБД - как совсем, до неисполнения и ошибки, так и частично, давая неверные результаты. Причём что-то легко адаптируется, а что-то не адаптируется вообще никак, требуя полного переписывания с нуля.
    Ответ написан
  • Как задать триггер менять значение в поле при изменении в другом поле?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE TRIGGER tr
    ON routes
    AFTER INSERT 
    AS 
    UPDATE [user]
    SET [update] = 1
    FROM INSERTED
    WHERE id = INSERTED.user_id;

    fiddle
    Ответ написан
    2 комментария