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

Модераторы: Pr0[)!9Y, Akina, JoeUser
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Помогите с запросом
SQL server 2014 + SQL management studio.

!
Пожалуйста, уточни название и версию целевого сервера БД

Запрос:
user posted image
ExpandedWrap disabled
    SELECT     Payment.Number, Payment.Date, PaymentDetail.ID AS PaymentDetailID, PaymentDetail.Value, Invoice.FileAs, Invoice.Number AS Expr1, Project.FileAs AS Expr2
    FROM         PaymentDetail INNER JOIN
                          Payment ON PaymentDetail.PaymentID = Payment.ID INNER JOIN
                          Invoice ON PaymentDetail.InvoiceID = Invoice.ID INNER JOIN
                          Project ON Invoice.ProjectID = Project.ID INNER JOIN
                          DocumentCategory ON Project.ID = DocumentCategory.DocumentID INNER JOIN
                          Category ON DocumentCategory.CategoryID = Category.ID
    ORDER BY Payment.Date


Проблема:
В таблице DocumentCategory присутствуют не все значения из таблицы Project, следовательно итоговая таблица усекается до не пустых вхождений(с 1000 до 700)

Вопрос:
Как запрос построить таким образом, что если DocumentCategory.DocumentID не найден, то вместо него(ну и дальше в Category) просто писалось null и все(т.е. число записей осталось 1000).
Сообщение отредактировано: ^D^ima -
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
ExpandedWrap disabled
     
LEFT JOIN DocumentCategory
Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.
Бинго!!!

Akina
Не напомнишь, как называется функция объединения(суммирования) строк?

1СИНИЙ
2КРАСНЫЙ
3СИНИЙ


суммировались в
4СИНИЙ
2КРАСНЫЙ
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
Цитата ^D^ima @
как называется функция объединения(суммирования) строк?

Это шутка такая? у тебя суммируются числа, а не строки. SUM() ... А по строке выполняется группировка. GROUP BY ...
Сообщение отредактировано: Akina -
Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.
Ошибка:
ExpandedWrap disabled
    SELECT     /*Payment.Date, Payment.FileAs AS Payment,*/ Payment.TotalWithVATBC, /*Project.FileAs AS Project,*/ Category.FileAs AS Category
    FROM         PaymentDetail INNER JOIN
                          Payment ON PaymentDetail.PaymentID = Payment.ID INNER JOIN
                          Invoice ON PaymentDetail.InvoiceID = Invoice.ID INNER JOIN
                          Project ON Invoice.ProjectID = Project.ID LEFT OUTER JOIN
                          DocumentCategory ON Project.ID = DocumentCategory.DocumentID LEFT OUTER JOIN
                          Category ON DocumentCategory.CategoryID = Category.ID
    WHERE     (Payment.FileAs NOT LIKE N'%-1%') AND (Payment.FileAs NOT LIKE N'%-3%') and (Payment.Date between '01.01.2017' and '31.12.2017' )
    /*ORDER BY Payment.Date*/
    GROUP BY Payment.TotalWithVATBC


Сообщение 8120, уровень 16, состояние 1, строка 1
Столбец "Category.FileAs" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Добавлено
Мне что-то типа такого нужно:
ExpandedWrap disabled
    GROUP BY Category.FileAs,sum(Payment.TotalWithVATBC)

Чтобы для одинаковых Category.FileAs суммировались их Payment.TotalWithVATBC
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
Так получилось, всем спасибо.
ExpandedWrap disabled
    SELECT     /*Payment.Date, Payment.FileAs AS Payment,*/ sum(Payment.TotalWithVATBC), /*Project.FileAs AS Project,*/ Category.FileAs AS Category
    FROM         PaymentDetail INNER JOIN
                          Payment ON PaymentDetail.PaymentID = Payment.ID INNER JOIN
                          Invoice ON PaymentDetail.InvoiceID = Invoice.ID INNER JOIN
                          Project ON Invoice.ProjectID = Project.ID LEFT OUTER JOIN
                          DocumentCategory ON Project.ID = DocumentCategory.DocumentID LEFT OUTER JOIN
                          Category ON DocumentCategory.CategoryID = Category.ID
    WHERE     (Payment.FileAs NOT LIKE N'%-1%') AND (Payment.FileAs NOT LIKE N'%-3%') and (Payment.Date between '01.01.2017' and '31.12.2017' )
     
    /*ORDER BY Payment.Date*/
    GROUP BY Category.FileAs
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
Цитата ^D^ima @
Так получилось

Мне неизвестна физическая сущность хранящихся в таблицах сведений, но создаётся впечатление, что запрос избыточен. Как я понимаю, не может быть такого, чтобы в DocumentCategory присутствовала запись о CategoryID, к которой нет соответствующей записи в таблице Category. Но если так, то нет смысла связывать таблицу Category левым связыванием, достаточно внутреннего. А если поле Category.ID уникально (а на показанной схеме это вообще первичный ключ) - то таблицу Category вообще можно удалить из списка таблиц-источников запроса.
Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.
Akina
Спасибо за совет.

А можно так сделать, чтобы Category.FileAs AS Category объединяло все найденные варианты в 1 строку.

Я имею в виду что если для Project.ID найдется несколько DocumentCategory.DocumentID и Category.ID чтобы эти строки в 1 объединились?

ДокументКатегория
1Категория 1
1Категория 2


переделалось в

ДокументКатегория
1Категория 1, Категория 2
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
Цитата ^D^ima @
А можно так сделать, чтобы Category.FileAs AS Category объединяло все найденные варианты в 1 строку.

У Вас MS SQL. Если версия позволяет, то можете использовать STRING_AGG. Иначе разве что через FOR XML.
Сообщение отредактировано: Akina -
Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.
помогите отформатировать число.

Я хочу чтобы сотые отделялись запятой(12345,67)
А то получается что SQL management studio выдает корректно, с запятой, а при обработке того-же запроса через sqlcmd получается точка
Я написал так:
ExpandedWrap disabled
    Format( sum(PaymentDetail.Value) , '#,00') AS Сумма

но почему-то дробную часть вообще отсекает

Добавлено
или придется переводить в строку и делать replace?
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
Вместо
ExpandedWrap disabled
    sum(PaymentDetail.Value) AS Сумма


Стало:
ExpandedWrap disabled
    SELECT   replace( CAST(  sum(PaymentDetail.Value) as varchar(20) ) ,'.',',')AS Сумма


Так заработало, но как-то череопно выглядит. PaymentDetail.Value имеет тип данных money
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
Цитата ^D^ima @
SQL management studio выдает корректно, с запятой

Потому что SSMS - это средств отображения, которое форматирует результат, используя установленный системный или настраиваемый разделитель/формат.
Цитата ^D^ima @
при обработке того-же запроса через sqlcmd получается точка

А sqlcmd отдаёт результат as is, используя стандартный разделитель.
Цитата ^D^ima @
Так заработало, но как-то череопно выглядит.

Попробуй
ExpandedWrap disabled
    Format( sum(PaymentDetail.Value) , N'#.00', N'ru-ru') AS Сумма
Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.
:thanks:
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
Цитата Akina @
N

Что означает N в формате?
"Воля - это то, что заставляет тебя побеждать, когда твой рассудок говорит тебе, что ты повержен" Карлос Кастанеда
Цитата ^D^ima @
Что означает N в формате?

Если посмотреть описание функции Format, то увидишь. что второй и третий параметры имеют тип Nvarchar, а не просто varchar.
Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:
Страницы: (3) [1] 2 3  все


Рейтинг@Mail.ru
[ Script Execution time: 0,1510 ]   [ 20 queries used ]   [ Generated: 24.09.17, 12:01 GMT ]