Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Реально ли сделать такое в SQL?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
rpe4a
Tests.Directory_id = '+@id+')
->
Tests.Directory_id = '''+@id+''')
6 ноя 14, 14:21    [16806184]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
Konst_One
Member

Откуда:
Сообщений: 11677
а может не надо такое делать в SQL?
у вас же есть Excel, там всё это замечательно делается через drag-n-drop в Pivot, главное подготовить правильно большую плоскую табличку со всей детализацией
6 ноя 14, 14:23    [16806196]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Konst_One
а может не надо такое делать в SQL?
у вас же есть Excel, там всё это замечательно делается через drag-n-drop в Pivot, главное подготовить правильно большую плоскую табличку со всей детализацией

пипл хатит хардкора и @#$ли - не надо его останавливать
6 ноя 14, 14:29    [16806246]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
Glory, спасибо, думаю уже усталость сказывается, поправил, еще ошибки сейчас исправлю.
6 ноя 14, 14:46    [16806428]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
o-o и Glory, спасибо. Это я уже заработался просто, все ровно там ошибка.
ошибка
Сообщение 102, уровень 15, состояние 1, строка 18
Неправильный синтаксис около конструкции "FEA".
6 ноя 14, 15:10    [16806651]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104751
rpe4a
Это я уже заработался просто, все ровно там ошибка.

Ошибка "неправильный синтаксис" лечится использованием правильного, документированного синтаксиса
В вашем случае на строке 18 вашего запроса
6 ноя 14, 15:13    [16806676]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
Konst_One, светлый ум у вас, я предлагал, сказали, что это дилетантство.
6 ноя 14, 15:17    [16806714]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
o-o
Guest
rpe4a,

вместо EXEC сделайте своей собранной строке PRINT,
потом ее в студию в окно засуньте и на кнопку PARSE нажмите (иконка галочка)
укажет, в каком именно месте ошибка, не разберетесь, вываливайте сюда.
ЦЕЛИКОМ!
6 ноя 14, 15:39    [16806872]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
Konst_One
Member

Откуда:
Сообщений: 11677
rpe4a
Konst_One, светлый ум у вас, я предлагал, сказали, что это дилетантство.


почему ? нормальное решение для автоматизации. зачем давать серверу не свойственные ему задачи, пусть этим клиентское ПО занимается.
6 ноя 14, 15:39    [16806876]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
o-o
Guest
Konst_One
rpe4a
Konst_One, светлый ум у вас, я предлагал, сказали, что это дилетантство.


почему ? нормальное решение для автоматизации. зачем давать серверу не свойственные ему задачи, пусть этим клиентское ПО занимается.

да все потому.
что когда сами дилетатны, то других этим и обзывают. давно уже так и повсюду.
а если до вас не докатилось, то радуйтесь.
6 ноя 14, 15:46    [16806914]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
o-o, вы даже не представляете, вот рабочий вариант, забыл
автор
as pvt
в конце поставить

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
declare @id nvarchar(max) = 'BE4DB2CE-C95D-E411-9FEA-00215AA6C898'

SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME(Question_id)
FROM (SELECT DISTINCT UserQuestions.Question_id FROM UserQuestions where UserQuestions.UserTest_id
			 in (select UserTest_id from UserTests where UserTests.Directory_Test_id = @id)) AS Courses;

--select @ColumnName
set @DynamicPivotQuery = N'select  FIO, '+@ColumnName+' from 
(
select
      --Directory_name as DirectoryName
	  Users.User_surname + users.User_name + Users.User_patronymic as FIO
	  --,Org_name as ORG
	  ,UserTests.UserTest_id as UserTestID
	  --,UserQuestions.Question_id as QuestionId
	  --,REPLACE(UserQuestions.Question_content, char(10), '') as [Вопрос]
	  ,cast(UserQuestions.Question_isTrue as decimal (5,2)) as result
	  --,cast(sum(UserQuestions.Question_isTrue) over (partition by UserTests.UserTest_id) as decimal (5,2)) as TotalResult
  FROM [attestation].[dbo].[Directories]
  inner join Tests on Directories.Directory_id = Tests.Directory_id
  inner join UserTests on UserTests.Directory_Test_id = Tests.Directory_id
  inner join Users on Users.User_id = UserTests.User_id
  inner join Orgs on Orgs.Org_id = Users.Org_id
  inner join UserQuestions on UserQuestions.UserTest_id = UserTests.UserTest_id
  where Tests.Directory_id = '''+@id+''') as x
  pivot (
  max(result) for UserTestID in ('+@ColumnName+')
  ) as pvt'

  execute (@DynamicPivotQuery)

еще бы данные выводились, чето не выводятся, ну хотя бы по столбцам разбиваются. :) Значит на верном пути!
6 ноя 14, 16:03    [16807046]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104751
rpe4a
еще бы данные выводились, чето не выводятся, ну хотя бы по столбцам разбиваются. :) Значит на верном пути!

Вы бы сначала просто написали работающий запрос. А потом бы уже ударялись в дебри динамики

А то у вас вон под 'BE4DB2CE-C95D-E411-9FEA-00215AA6C898' декларируется переманная с максм.размером 2Гб
6 ноя 14, 16:07    [16807079]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
Glory, а по подробнее про декларирование переменных? Первый раз слышу такое...
7 ноя 14, 07:32    [16809885]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
Доброе всем утро, кажись получилось. Вот скрипт:
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
declare @id nvarchar(max) = 'BE4DB2CE-C95D-E411-9FEA-00215AA6C898'

SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME(Question_id)
FROM (SELECT DISTINCT UserQuestions.Question_id FROM UserQuestions where UserQuestions.UserTest_id
			 in (select UserTest_id from UserTests where UserTests.Directory_Test_id = @id)) AS Courses;

--select @ColumnName
set @DynamicPivotQuery = N'select  DirectoryName, FIO, ORG,CountQuestion,TotalResult,TotalPercent,'+@ColumnName+'  from 
(
select
      Directory_name as DirectoryName
	  ,Users.User_surname +'' ''+ users.User_name +'' ''+ Users.User_patronymic as FIO
	  ,Org_name as ORG
	  ,UserTests.UserTest_id as UserTestID
	  ,UserQuestions.Question_id as QuestionId
	  --,REPLACE(UserQuestions.Question_content, char(10), '') as [Вопрос]
	  ,cast(UserQuestions.Question_isTrue as decimal (5,2)) as result
	  ,cast(sum(UserQuestions.Question_isTrue) over (partition by UserTests.UserTest_id) as decimal (5,2)) as TotalResult
	  ,cast(count(UserQuestions.Question_isTrue)over (partition by UserTests.UserTest_id) as decimal (5,2)) as CountQuestion
	  ,cast((sum(UserQuestions.Question_isTrue) over (partition by UserTests.UserTest_id)) * 100 / (count(UserQuestions.Question_isTrue)over (partition by UserTests.UserTest_id)) as decimal(5,2)) as TotalPercent
  FROM [attestation].[dbo].[Directories]
  inner join Tests on Directories.Directory_id = Tests.Directory_id
  inner join UserTests on UserTests.Directory_Test_id = Tests.Directory_id
  inner join Users on Users.User_id = UserTests.User_id
  inner join Orgs on Orgs.Org_id = Users.Org_id
  inner join UserQuestions on UserQuestions.UserTest_id = UserTests.UserTest_id
  where Tests.Directory_id = '''+@id+''') as x
  pivot (
  max(result) for QuestionId in ('+@ColumnName+')
  ) as pvt'

  execute (@DynamicPivotQuery)
  print(@DynamicPivotQuery)


ну и соответственно результат:
Мониторинг воспитателей от 28.10.2014 Балуев Андрей Михалович МАДОУ "Детский сад № 135" 10.00 4.00 40.00 0.00 0.00 0.00 1.00 1.00 0.00 0.00 1.00 0.33 0.67
Мониторинг воспитателей от 28.10.2014 Вахрина Лариса Александровна МАДОУ "Детский сад № 24" 10.00 7.50 75.00 1.00 1.00 1.00 0.00 1.00 1.00 1.00 1.00 0.00 0.50

Вроде бы все гуд, подскажи может я, что пропустил? И да огромное спасибо за советы, ссылки и решения!
7 ноя 14, 08:10    [16809926]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104751
rpe4a
а по подробнее про декларирование переменных? Первый раз слышу такое...

Т.е. вы пишите команды вида declare @id nvarchar(max) = 'BE4DB2CE-C95D-E411-9FEA-00215AA6C898', вообще незная, что это и для чего нужно ?
7 ноя 14, 09:23    [16810086]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
Glory
Т.е. вы пишите команды вида declare @id nvarchar(max) = 'BE4DB2CE-C95D-E411-9FEA-00215AA6C898', вообще незная, что это и для чего нужно ?

Знаю declare объявить переменную далее @имя переменной потом тип переменной. Как в учебнике написано, так и пишу... что тут такого?

Возможно вас смущает (max)? Тогда поясните мне в чем проблема, буду рад выслушать ;) Как я понимаю видимо она несет в себе как раз что-то про 2 гб о которых вы говорите?
7 ноя 14, 09:40    [16810155]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104751
rpe4a
Возможно вас смущает (max)? Тогда поясните мне в чем проблема, буду рад выслушать

А самому прочитать "как в учебнике написано" ?
Или вы просто не знаете никаких других типов данных,кроме nvarchar(max) ?
7 ноя 14, 09:44    [16810177]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
iap
Member

Откуда: Москва
Сообщений: 47197
Glory,

это всё правильно, да... Автор ещё не представляет значение буквы N в тексте, который он пишет.
И поэтому не пишет эту волшебную букву во многих нужных местах.
Но в данном случае смысл в объявлении переменной именно этого типа всё же есть.
Ведь иначе будет неявное конвертирование для EXECUTE(),
который принимает параметр именно типа NVARCHAR(MAX).
7 ноя 14, 09:49    [16810191]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
Glory
А самому прочитать "как в учебнике написано" ?

Ну сейчас я полезу в учебник, который я читал полгода назад. ;)

Glory
Или вы просто не знаете никаких других типов данных,кроме nvarchar(max) ?

толи вы самоутвердиться хочете, толи что? К вашеу горю знаю, но раз уж вы завели речь о этой nvarchar(max), а я нашел пробел в своих знаниях, можно вас попросить разъяснить в чем тут соль?
7 ноя 14, 09:57    [16810238]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
iap,

iap
Автор ещё не представляет значение буквы N в тексте, который он пишет. И поэтому не пишет эту волшебную букву во многих нужных местах.

В чем ее сила бро? :)

iap
Ведь иначе будет неявное конвертирование для EXECUTE(),
который принимает параметр именно типа NVARCHAR(MAX).

Дак у меня так и написано или нет?
7 ноя 14, 09:59    [16810253]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104751
rpe4a
К вашеу горю знаю, но раз уж вы завели речь о этой nvarchar(max), а я нашел пробел в своих знаниях, можно вас попросить разъяснить в чем тут соль?

Соль в том, что вы не знаете про типы данных практически ничего.
Даже, например, про размеры переменных того или иного типа.
7 ноя 14, 10:00    [16810256]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
Glory
Соль в том, что вы не знаете про типы данных практически ничего.
Даже, например, про размеры переменных того или иного типа.


Возможно, мне интересно про 2 гб мистических, что значит если я объявляю переменную NVARCHAR(MAX) то под нее мне отводиться 2 гб памяти или как? это ведь не означает что declare @id nvarchar(max) = 'BE4DB2CE-C95D-E411-9FEA-00215AA6C898' весит 2 гб?
7 ноя 14, 10:06    [16810281]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104751
rpe4a
Возможно, мне интересно про 2 гб мистических, что значит если я объявляю переменную NVARCHAR(MAX) то под нее мне отводиться 2 гб памяти или как?

В учебнике этого не написано ? Или вы не дочитали еще до этого места ?
7 ноя 14, 10:08    [16810288]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
rpe4a
Member

Откуда: Пермь
Сообщений: 110
Glory, отвечая вопросом на вопрос мы не придем к консенсус, почитав хотя бы вики
WIKI
nvarchar [ ( n | max ) ]
Строковые данные переменной длины в Юникоде. Параметр n определяет длину строки и должен иметь значение от 1 до 4000. Значение max указывает, что максимальный размер при хранении составляет 2^31-1 байт (2 ГБ). Размер хранилища в байтах вдвое больше числа введенных символов + 2 байта. По стандарту ISO синонимами для типа nvarchar являются типы national char varying и national character varying.

Что плохого в том, что я объявляю переменную с типом nvarchar(max), я просто не хочу замарачиваться и высчитывать сколько мне там надо символов будет... ставлю сразу max и все... хранить то ясно, что там 2 гб инфы мне не придвидится...
7 ноя 14, 10:59    [16810499]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли сделать такое в SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104751
rpe4a
Что плохого в том, что я объявляю переменную с типом nvarchar(max), я просто не хочу замарачиваться и высчитывать сколько мне там надо символов будет..

Где "там" ? В Tests.Directory_id ?
Т.е. вы вообще все свой переменным всегда будете объявлять nvarchar(max) ?

rpe4a
Glory, отвечая вопросом на вопрос мы не придем к консенсус

Ну так это вы тут начали вопросы задавать, как будто на курсах - расскажите мне про то, расскжите мне про это
7 ноя 14, 11:05    [16810524]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить