На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
Страницы: (15) « Первая ... 3 4 [5] 6 7 ...  14 15 все  ( Перейти к последнему сообщению )  
> Помогите с запросом
    Цитата Akina @
    dummy

    вот из-за этой мелочи у меня выдавало ошибку, р-р-р-р-р-р :wall:
      Цитата ^D^ima @
      вот из-за этой мелочи у меня выдавало ошибку

      ВСЁ должно иметь алиасы. Абсолютно всё. Или должна быть стопроцентная убеждённость, что в данной конкретной точке алиас не обязателен.
        Ясно :)
          Akina
          Теоретический вопрос:

          если мне в этом-же запрос( Помогите с запросом (сообщение #3744524) )нужно получить результаты его-же но за другой период(некое сальдо), та как это лучше оформить? Как хранимую процедуру и ей передавать даты, или ещё существуют способы? Аля процедура\функция в самом запросе?
            Если безотносительно к конкретному тексту запроса, я верно понимаю, что задача такова: для некоей сложной выборки, в которой в качестве одного из условий вводится некий параметр (дата) нужно получить одновременно результаты этой выборки для некоего набора значений этого параметра?

            Если так, я бы, наверное, пошёл именно по пути создания хранимой процедуры, которая в некотором формате примет набор значений этого параметра, для каждого значения получит требуемые результаты, и вернёт весь массив полученных данных во временной таблице с предопределённым именем, после чего он уже будет обрабатываться в соответствии с требуемой логикой. Само собой, в этой временной таблице кроме собственно ответных значений (в запросе по ссылке это поля Вид, СуммаПриход, СуммаРасход) должно быть предусмотрено поле, хранящее значение параметра, для которого получена данная конкретная запись (например, поле Дата, в которую литерально копируется значение даты, на которую рассчитываются заданные значения полей Вид, СуммаПриход и СуммаРасход).
              Akina
              Временная таблица должна быть создана в таблицах базы данных?

              Добавлено
              Цитата Akina @
              для некоей сложной выборки, в которой в качестве одного из условий вводится некий параметр (дата) нужно получить одновременно результаты этой выборки для некоего набора значений этого параметра?

              именно так.

              А то придется в этом-же запросе копировать его ещё раз с другими датами
                ExpandedWrap disabled
                  use [PJM10]
                  go
                  create procedure my1
                  @Day char(2), @month char(2)
                  as
                  begin
                  (
                    select top 10 Employee.FileAs
                   from Employee)
                  end
                   
                   
                  go
                   
                   
                   
                   my1 'DA','DQ'
                   
                  /* union all
                   
                  my1 'DA','DQ'
                  */


                1 почему предупреждение: "В базе данных уже существует объект с именем "my1"."
                2 почему на union all ругается если раскоментить, хотя если вместо него поставить go, то работает, но 2 таблицы выдает?
                  https://msdn.microsoft.com/en-us/library/ms...v=sql.105).aspx

                  1) Прежде чем создавать процедуру, надо проверить существование предыдущей версии, и если она есть - удалить её.
                  ExpandedWrap disabled
                    IF OBJECT_ID ( 'SchemaName.procedureName', 'P' ) IS NOT NULL
                        DROP PROCEDURE SchemaName.procedureName;
                    GO

                  2) Выполнение процедуры без EXECUTE (или сокращённой его формы EXEC) допускается лишь в случае, если её вызов является первым оператором (всего пакета, или отдельного блока пакета, т.е. непосредственно после GO). Во всех остальных случаях EXEC(UTE) обязателен.
                  Сообщение отредактировано: Akina -
                    ExpandedWrap disabled
                       exec my1 'DA','DQ'
                       
                      union all
                       exec my1 'DA','DQ'


                    так все равно на union all ругается
                      Ну ещё бы... ты хоть иногда в мануал-то заглядывай. UNION/EXCEPT/INTERSECT может объединять только запросы, а не любые конструкции, возвращающие набор записей.
                        Печально, спасибо.

                        А как можно взять дату: Первый день прошлого месяца и Последний день прошлого месяца '01.09.2017 00:00:00' - '30.09.2017 23:59:59'?
                        Первый день взял так
                        ExpandedWrap disabled
                          select convert(datetime,   '01.'+convert(char(2), month(getdate())-1)+'.'+convert(char(4), year(getdate())) )
                        но как-то длинно получилось, можно ли короче? А последний вообще не пойму как взять...

                        Добавлено
                        Последний день предыдущего месяца взял так:
                        ExpandedWrap disabled
                          EOMONTH(GETDATE( ),-1)
                        как туда 23:59:59 поставить?
                          Получилось 2 вариантами:
                          не знаю какой более правильный:
                          ExpandedWrap disabled
                            select SMALLDATETIMEFROMPARTS(year(EOMONTH(GETDATE( ),-1)),  month(EOMONTH(GETDATE( ),-1)),day(EOMONTH(GETDATE( ),-1)),'23','59')
                             
                            select convert(datetime, convert(char(10), EOMONTH(GETDATE( ),-1))+'T23:59:59')


                          Добавлено
                          Первый день прошлого месяца:
                          ExpandedWrap disabled
                            select convert(date, dateadd(month,-1,  dateadd(day,1-day(GETDATE( )),GETDATE( )) ) )


                          Я правильно понимаю если date сравнивают с datetime, то подразумевают что в date время '00:00:00' ??? Т.е. если в date и datetime будет одинаковая дата, то в не зависимости от времени они будут равны?

                          Добавлено
                          Пока взял это:
                          ExpandedWrap disabled
                            declare @d1 datetime
                            declare @d2 datetime
                            set @d1=convert(date, dateadd(month,-1,  dateadd(day,1-day(GETDATE( )),GETDATE( )) ) )  
                            set @d2=convert(datetime, convert(char(10), EOMONTH(GETDATE( ),-1))+'T23:59:59')
                             
                            select @d1
                            select @d2

                          Это я к чему всё, чтобы избавиться от этой конструкции:
                          ExpandedWrap disabled
                            ( YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and    MONTH(ExpenditureEntry.Date)=MONTH(GETDATE( ))-1)

                          А то получается что, действительно, в январе 2018 я буду получать данные не 12.2017 а 12.2018, хотя я мог бы чтото с IF'ом нагородить и отнимать год если месяц первый
                            Тебе нужно взять весь предыдущий месяц, верно? то есть больше или равно 0:00 первого числа и строго меньше 0:00 первого числа следующего (в данном конкретном случае текущего) месяца. Т.е.

                            ExpandedWrap disabled
                              WHERE mydate >= DATEADD(day,1,EOMONTH(GETDATE(),-2))
                                AND mydate <  DATEADD(day,1,EOMONTH(GETDATE(),-1))


                            Цитата ^D^ima @
                            Я правильно понимаю если date сравнивают с datetime, то подразумевают что в date время '00:00:00' ???

                            Тип date не содержит компоненты времени. При сравнении данные приводятся к общему формату, не теряющему точность, т.е. к datetime. Т.е. к date добавляется компонента времени, а раз для неё нет значение, то нулевая. Так что всё правильно.

                            Цитата ^D^ima @
                            Это я к чему всё, чтобы избавиться от этой конструкции

                            В первую очередь ты должен избавиться от любых действий, кроме сравнений, для полей таблицы. Для текущей даты значение вычислится один раз, каким бы ни было сложным выражение, а для значений из таблицы - для каждой записи. Что дольше и затратнее? Опять же - в каком случае можно использовать индекс?
                              Цитата Akina @
                              WHERE mydate >= DATEADD(day,1,EOMONTH(GETDATE(),-2))
                                AND mydate <  DATEADD(day,1,EOMONTH(GETDATE(),-1))

                              Прикольно. Это как-то через between передать можно?
                                Цитата ^D^ima @
                                Это как-то через between передать можно?

                                Изучи https://msdn.microsoft.com/en-us/library/ms...v=sql.105).aspx , особенно последний пример с пояснениями. Как я из них понял - нельзя, но вдруг я ошибаюсь...
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (15) « Первая ... 3 4 [5] 6 7 ...  14 15 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0434 ]   [ 16 queries used ]   [ Generated: 25.04.24, 02:09 GMT ]