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

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Вообще обычно для этого используется функция PIVOT TABLE

    Твой пример

    Результат:
    +=========+=======+==========+============+============+============+============+
    | fam     | name  | otch     | 2021-03-17 | 2021-03-18 | 2021-03-19 | 2021-03-23 |
    +=========+=======+==========+============+============+============+============+
    | Петров  | Иван  | Иванович | 0          | 0          | 3          | 3          |
    +---------+-------+----------+------------+------------+------------+------------+
    | Сидоров | Петр  | Иванович | 4          | 4          | 0          | 4          |
    +---------+-------+----------+------------+------------+------------+------------+
    | Смирнов | Федор | Иванович | 0          | 0          | 0          | 5          |
    +---------+-------+----------+------------+------------+------------+------------+
    Ответ написан
  • Как ускорить (оптимизировать) SQL-запрос с временным интервалом?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    1. Нужен индекс по полю "daten"
    2. Избавится от расчета даты в запросе, и передавать в запрос конкретную дату, рассчитанную перед запросом.
    UPD: 2-й пункт особого прироста не даст, из-за расчета справа от сравнения.
    Ответ написан
  • Near "отпуска": syntax error?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    На MSSQL проблема была что В Имени колонки не должно быть пробелов.
    CREATE TABLE Отпуск
    (Кодотпуска INTEGER PRIMARY KEY,
    ТипОтпуска CHAR (100) NOT NULL,
    ОплатаОтпуска FLOAT CHECK (ОплатаОтпуска > 10000),
    ЛьготыПоОтпуску FLOAT NOT NULL);

    так сработало ...
    и задумайтесь над использованием типов NVARCHAR и Money/Decimal/numeric ... всё таки цифры про деньги должны быть точными.
    Ответ написан
  • Как в Вывести обединение таблиц по условию ??

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Для описанного примера подходит left join, а для вывода строки при несовпадении использовать функции IsNull и Cast :

    TSQL пример

    Результат :

    +==================+======+===========+
    | name             | code | AutorCode |
    +==================+======+===========+
    | BookWithAutor    | 1    | 1         |
    +------------------+------+-----------+
    | BookWithoutAutor | 3    | Empty     |
    +------------------+------+-----------+
    Ответ написан
  • Как сделать выборку из таблицы и развернуть в строку?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Насколько понял, вам нужно попробовать реализовать "Pivot Table", но в PGSQL этой функции по умолчанию нет (я ей пользовался в MSSQL как встроенной). Если погуглить есть реализации этой функции на PGSQL через функцию "crosstab". Посмотрите, если устроит можете один раз организовать функцию и пользовать в подобных случаях. Но насколько это актуально конкретно для вас (может у вас всего 3 поля и имеет смысл просто запросом как в вашем примере реализовать) решать вам.
    Про языки, чтобы выбрать один указанный, оптимальнее использовать "coalesce( t.en, t.ru, t,ko)"

    UPD: т.к. имена полей у вас находятся в промежуточной таблице, если вы хотите чтобы значения "coalesce( t.en, t.ru, t,ko)" были в заголовках колонок, скорее всего придётся использовать "Динамический Pivot table" он несколько сложнее в организации, но производительней с точки зрения использования данных. Если же вас устроит "Fieidid" как заголовок колонки, можно воспользоваться обычным Pivot table.

    В MSSQL это выглядело бы примерно так:
    Select ItemId as ItemId,
    [fieldid1], [fieldid2], [fieldid3], [fieldid4], [fieldid5] 
    From
    (Select 
    	items.id as ItemId,
    	Coalesce(itemfields.en,itemfields.ru,itemfields.ko) as FieldName,
    	itemfields.fieldid as fieldid,
    	fields.key as value
    From
    	from items as items
    	left join item_fields as item_fields on items.id = item_fields.item_id
    		left join fields as fields On item_fields.fieldid = fields.id) SourceTable
    pivot
    (
    Max(value) for fieldid in ([fieldid1], [fieldid2], [fieldid3], [fieldid4], [fieldid5] )
    ) as PivotTable;
    Ответ написан
  • Как сделать SUM и COUNT при LEFT JOIN запросе?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    SELECT 
        t1.id, COUNT(t2.field2) AS cnt, SUM(t2.field2) AS sum_field2
    FROM tbl1 as t1
    left join tbl2 as t2 
    ON t1.id = t2.id
    group by  t1.id
    Ответ написан
  • Как получить все последние комментарии для всех пользователей?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Ну если джойны не доступны только по причине того что таблицы на разных серверах, и вас (Судя по вашему варианту "Костыля" представление пользователя в виде "user_id" - вас устраивает. Думаю такой вариант будет по красивше ... (Но это не точно).

    Select
    CommentTable.user_id,
    CommentTable.comment,
    CommentTable.created_ts
    From 
    comments as CommentTable
    Inner join 
    (Select 
    t.user_id as user_id ,
    Max(t.created_ts) as LastTime
    From comments as t
    Group by t.user_id) as LastTimeTable
    On CommentTable.user_id = LastTimeTable.user_id 
    and CommentTable.created_ts = LastTimeTable.LastTime


    Если у вас к таблице "Users" доступен select ... думаю можно попробовать сначала создать на сервере Таблицы comments временную таблицу
    Что-то типа
    Create table #tt1
    (user_id nvarchar(10),
    user_name nvarchar(100))
    
    Insert into #tt1 
    Select user_id , user_name from users

    и потом джойнить временную таблицу юзерсов с таблицей которая получилась из запроса выше ... тогда будут доступны ещё и данные таблицы юзерс. (насчет оптимальности не уверен, но думаю сработает)
    Итого будет типа :
    Create table #tt1
    (user_id nvarchar(10),
    user_name nvarchar(100))
    
    Insert into #tt1 
    Select user_id , user_name from users
    
    Select
    CommentTable.user_id,
    users.user_name,
    CommentTable.comment,
    CommentTable.created_ts
    From 
    comments as CommentTable
    Inner join 
    (Select 
    t.user_id as user_id ,
    Max(t.created_ts) as LastTime
    From comments as t
    Group by t.user_id) as LastTimeTable
    On CommentTable.user_id = LastTimeTable.user_id 
    and CommentTable.created_ts = LastTimeTable.LastTime
    Left join #tt1 as users
    on CommentTable.user_id = users.user_id
    
    drop table #tt1
    Ответ написан
  • Должен ли одинаковый запрос выполнятся с разным временем?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    ИМХО:
    1. Чтобы запрос корректно отсек лишние данные у вас должен быть Актуальный индекс по полю "date" в таблице "route_list_date".
    2. Не помешал был актуальный индекс по полю "id" в таблицах "route_list_date" и по полю "route_list_date_id" в таблице "route_list" (чтобы внутреннее соединение прошло быстрее.)
    Ответ написан
  • Как вывести в запросе sql записи с одинаковым кодом?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    -- Создаем временную таблицу для реализации примера
    Create table #tt1
    (_Code nvarchar(10),
    _Name nvarchar(100))
    
    -- Наполняем временную таблицу тестовыми данными
    Insert into #tt1 
    Select '1.', 'Муромец'
    Insert into #tt1 
    Select '2.', 'Никитич'
    Insert into #tt1 
    Select '2.', 'Муромец'
    Insert into #tt1 
    Select '3.', 'Плясовая'
    Insert into #tt1 
    Select '3.', 'Никитич'
    
    -- Выбираем строки где поле _Code повторяется 2 и более раз
    Select
    t1._Code,
    t1._Name,
    t3.Counter
    From
    #tt1 as t1
    inner join(
    	Select 
    		t2._Code, 
    		COUNT(t2._Name) as counter 
    		from #tt1 as t2
    		
    	group by 
    		t2._Code
    	Having COUNT(t2._Name) >1
    	) as t3
    on t1._Code = t3._Code
    
    -- Удаляем временную таблицу.
    drop table #tt1
    Ответ написан
  • Как можно оформить в базе данных следующую таблицу?

    Mikhail_E
    @Mikhail_E
    1С, SQL
    Думаю таблица для хранения должна выглядеть так (Колонки):
    "Игрок" - "ИгрокКоторгоОценил" - "Оценка" (Балл/Булево).
    Таким образом таблица будет компктной, а если нужно экстраполировать, это делается уже при выводе по конкретному набору данных.
    Профит:
    1. Вам не придётся хранить информацию о том, кого игрок не оценил.
    2. Если появляется новый игрок, вам не придётся изменять структуру таблицы (Добавлять колонку с пустыми значениями для всех)
    3. У вас будет понятный индекс (компактный из 2-х колонок) к таблице. (А не из колонок = кол-ву игроков).
    Ответ написан