Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
jonybest Member Откуда: Сообщений: 255 |
Доброго дня! Есть таблица с 50-тью полями. С имена полей с 1- по 31 - соответствую датам. Необходимо получить сумму значений строки с именами полей с 1- по 31 по условию где значения числа. Поискал в гугле, не нашел решения вопроса... Заранее спасибо за помощь! |
13 сен 18, 12:27 [21673367] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
... в правилах форума есть пункт в котором просят тестовіе данніе изобразить и желаемій результат..бо придумівать за вкас сие всем откровенно влом |
13 сен 18, 12:33 [21673372] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6802 |
jonybest, я так понимаю вы не хотите писать Col1 + Col2 ... ? можно развернуть CROSS APPLY () a Val и писать SUM(Val) остальное не понятно |
13 сен 18, 12:37 [21673383] Ответить | Цитировать Сообщить модератору |
256k Member Откуда: с.Торчилово, Псковская обл. Сообщений: 437 |
Сделать динамический запрос |
13 сен 18, 12:44 [21673396] Ответить | Цитировать Сообщить модератору |
jonybest Member Откуда: Сообщений: 255 |
все правильно SELECT [1]+[2]+[3]+[4]+[5]+[6]+[7]+[8]+[9]+[10]+[11]+[12]+[13]+[14]+[15]+[16]+[17]+[18]+[19]+[20]+ [21]+[22]+[23]+[24]+[25]+[26]+[27]+[28]+[29]+[30]+[31] FROM dbo.Tb_t WHERE dbo.Tb_t.mes = 3 AND dbo.Tb_t.god = '2018' and Нужно считать если 1. значение столбца - число - сумму чисел 2. значение столбца - буквы - сумму столбцов |
||
13 сен 18, 12:53 [21673410] Ответить | Цитировать Сообщить модератору |
Владимир Затуливетер Member Откуда: Сообщений: 427 |
Если честно, не очень понятно. Но возможно вам вычисляемый столбец поможет. Один раз напишите логику и будете пользоваться. https://docs.microsoft.com/en-us/sql/relational-databases/tables/specify-computed-columns-in-a-table?view=sql-server-2017 |
13 сен 18, 13:07 [21673430] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
а что дулать если в одной стоке в поле [4] стоит "12" ,а в другой "ФИ" ? |
||
13 сен 18, 14:32 [21673623] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
или DSQL или запрос с кучей case |
13 сен 18, 14:33 [21673625] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
далеко не факт, что это то. что нужно, но я пытался ![]() declare @t1 table ([1] varchar(100) ,[2] varchar(100) ,[3] varchar(100)); insert @t1 select * from(values('123','456','789'),('abc','def','ghi'),('123','asd','45f'))a(b,c,d) select isnull(cast(try_cast([1] as int)+try_cast([2] as int)+try_cast([3] as int) as varchar(max)),[1]+[2]+[3]) from @t1 |
||
13 сен 18, 14:37 [21673633] Ответить | Цитировать Сообщить модератору |
jonybest Member Откуда: Сообщений: 255 |
Спасибо, но чуть не то. Помогите повернуть таблицу, дальше я сам. Не работал ни когда с оператором UNPIVOT, не пойму что надо... |
||||
13 сен 18, 15:30 [21673763] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
declare @t1 table (id int ,[1] varchar(100) ,[2] varchar(100) ,[3] varchar(100)); insert @t1 select * from(values(1,'123','456','789'),(2,'abc','def','ghi'),(3,'123','asd','45f'))a(a,b,c,d) select id,col,val from @t1 unpivot(val for col in ([1],[2],[3]))u |
||||
13 сен 18, 15:40 [21673794] Ответить | Цитировать Сообщить модератору |
jonybest Member Откуда: Сообщений: 255 |
Спасибо! Многое почерпнул. Параллельно еще вопрос bl = sum ( case when ( val like 'Б%' and (val1 not IN (@v1, @v2, @v3)) and (val1 not IN (@p1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10)) and DATEPART(dw, cast(@g+'.'+@m+'.'+val1 as datetime))not IN (6, 7)) then ( case when (val1 IN(@pp1,@pp2)) then 7 else 8 end) else 0 end ), ot = sum ( case when ( val like 'От%' and (val1 not IN (@v1, @v2, @v3)) and (val1 not IN (@p1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10)) and DATEPART(dw, cast(@g+'.'+@m+'.'+val1 as datetime))not IN (6, 7)) then 8 else 0 end ), normr1 = @n-sum ( case when ( val like 'Б%' and (val1 not IN (@v1, @v2, @v3)) and (val1 not IN (@p1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10)) and DATEPART(dw, cast(@g+'.'+@m+'.'+val1 as datetime))not IN (6, 7)) then ( case when (val1 IN(@pp1,@pp2)) then 7 else 8 end) else 0 end )- sum ( case when ( val like 'От%' and (val1 not IN (@v1, @v2, @v3)) and (val1 not IN (@p1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10)) and DATEPART(dw, cast(@g+'.'+@m+'.'+val1 as datetime))not IN (6, 7)) then 8 else 0 end ) можно как то упростить запрос? В идеале normr1 =@n-bl-ot |
||||
18 сен 18, 16:39 [21678391] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9693 |
jonybest,bl = sum(a.f1), ot = sum(b.f2), normr1 = @n-sum (a.f1)-sum(b.f2) from ... cross apply (select case when ( val like 'Б%' and (val1 not IN (@v1, @v2, @v3)) and (val1 not IN (@p1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10)) and DATEPART(dw, cast(@g+'.'+@m+'.'+val1 as datetime))not IN (6, 7)) then ( case when (val1 IN(@pp1,@pp2)) then 7 else 8 end) else 0 end) a(f1) cross apply (select case when ( val like 'От%' and (val1 not IN (@v1, @v2, @v3)) and (val1 not IN (@p1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10)) and DATEPART(dw, cast(@g+'.'+@m+'.'+val1 as datetime))not IN (6, 7)) then 8 else 0 end) b(f2) ЗЫ: Если не хотите проблем - никогда не пользуйтесь not in |
18 сен 18, 16:52 [21678426] Ответить | Цитировать Сообщить модератору |
jonybest Member Откуда: Сообщений: 255 |
Спасибо! А как лучше организовать перечисление значений переменных? Через @v1 or @v2 or @v3? |
18 сен 18, 16:56 [21678430] Ответить | Цитировать Сообщить модератору |
jonybest Member Откуда: Сообщений: 255 |
Каюсь, дал не весь код SELECT bl = sum ( case when ( val like 'Б%' and (val1 not IN (@v1, @v2, @v3)) and (val1 not IN (@p1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10)) and DATEPART(dw, cast(@g+'.'+@m+'.'+val1 as datetime))not IN (6, 7)) then ( case when (val1 IN(@pp1,@pp2)) then 7 else 8 end) else 0 end ), ot = sum ( case when ( val like 'От%' and (val1 not IN (@v1, @v2, @v3)) and (val1 not IN (@p1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10)) and DATEPART(dw, cast(@g+'.'+@m+'.'+val1 as datetime))not IN (6, 7)) then 8 else 0 end ), normr1 = @n-sum ( case when ( val like 'Б%' and (val1 not IN (@v1, @v2, @v3)) and (val1 not IN (@p1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10)) and DATEPART(dw, cast(@g+'.'+@m+'.'+val1 as datetime))not IN (6, 7)) then ( case when (val1 IN(@pp1,@pp2)) then 7 else 8 end) else 0 end )- sum ( case when ( val like 'От%' and (val1 not IN (@v1, @v2, @v3)) and (val1 not IN (@p1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10)) and DATEPART(dw, cast(@g+'.'+@m+'.'+val1 as datetime))not IN (6, 7)) then 8 else 0 end ) unpivot(val for val1 in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15] ,[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])) u WHERE mes = '3' AND god = '2018' Ваш пример не могу состыковать с unpivot |
||
18 сен 18, 17:31 [21678498] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9693 |
Поэтому надежней, например, так not exists(select * from (values (@v1), (@v2), (@v3)) t(v) where v = val1))
|
||||
18 сен 18, 18:11 [21678537] Ответить | Цитировать Сообщить модератору |
jonybest Member Откуда: Сообщений: 255 |
СПС! Разобрался! |
||
19 сен 18, 09:36 [21679028] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |