Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сумма значений строки  [new]
jonybest
Member

Откуда:
Сообщений: 246
Доброго дня!
Есть таблица с 50-тью полями. С имена полей с 1- по 31 - соответствую датам.
Необходимо получить сумму значений строки с именами полей с 1- по 31 по условию где значения числа.
Поискал в гугле, не нашел решения вопроса...
Заранее спасибо за помощь!
13 сен 18, 12:27    [21673367]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
... в правилах форума есть пункт в котором просят тестовіе данніе изобразить и желаемій результат..бо придумівать за вкас сие всем откровенно влом
13 сен 18, 12:33    [21673372]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
jonybest,

я так понимаю вы не хотите писать Col1 + Col2 ... ?
можно развернуть CROSS APPLY () a Val и писать SUM(Val)

остальное не понятно
13 сен 18, 12:37    [21673383]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
256k
Member

Откуда: с.Торчилово, Псковская обл.
Сообщений: 437
Сделать динамический запрос
13 сен 18, 12:44    [21673396]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
jonybest
Member

Откуда:
Сообщений: 246
TaPaK
jonybest,

я так понимаю вы не хотите писать Col1 + Col2 ... ?
можно развернуть CROSS APPLY () a Val и писать SUM(Val)

остальное не понятно


все правильно
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]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
Владимир Затуливетер
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]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
jonybest
Нужно считать если
1. значение столбца - число - сумму чисел
2. значение столбца - буквы - сумму столбцов

а что дулать если в одной стоке в поле [4] стоит "12" ,а в другой "ФИ" ?
13 сен 18, 14:32    [21673623]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
или DSQL или запрос с кучей case
13 сен 18, 14:33    [21673625]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Maxx
или DSQL или запрос с кучей case


далеко не факт, что это то. что нужно, но я пытался

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]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
jonybest
Member

Откуда:
Сообщений: 246
Посетитель
Maxx
или DSQL или запрос с кучей case


далеко не факт, что это то. что нужно, но я пытался


Спасибо, но чуть не то.
Помогите повернуть таблицу, дальше я сам.
Не работал ни когда с оператором UNPIVOT, не пойму что надо...
13 сен 18, 15:30    [21673763]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
jonybest
Посетитель
пропущено...


далеко не факт, что это то. что нужно, но я пытался


Спасибо, но чуть не то.
Помогите повернуть таблицу, дальше я сам.
Не работал ни когда с оператором UNPIVOT, не пойму что надо...


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]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
jonybest
Member

Откуда:
Сообщений: 246
Посетитель
jonybest
пропущено...

Спасибо, но чуть не то.
Помогите повернуть таблицу, дальше я сам.
Не работал ни когда с оператором UNPIVOT, не пойму что надо...


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


Спасибо! Многое почерпнул. Параллельно еще вопрос
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]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9270
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]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
jonybest
Member

Откуда:
Сообщений: 246
Спасибо! А как лучше организовать перечисление значений переменных? Через
@v1 or @v2 or @v3
?
18 сен 18, 16:56    [21678430]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
jonybest
Member

Откуда:
Сообщений: 246
invm
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


Каюсь, дал не весь код
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]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9270
jonybest
Спасибо! А как лучше организовать перечисление значений переменных? Через
@v1 or @v2 or @v3

?
Можно через и not in. Но только если среди перечисленных значений гарантированно не может быть null
Поэтому надежней, например, так
not exists(select * from (values (@v1), (@v2), (@v3)) t(v) where v = val1))

jonybest
Каюсь, дал не весь код
Видимо опять показали не весь запрос.
18 сен 18, 18:11    [21678537]     Ответить | Цитировать Сообщить модератору
 Re: Сумма значений строки  [new]
jonybest
Member

Откуда:
Сообщений: 246
jonybest
Каюсь, дал не весь код
Видимо опять показали не весь запрос.[/quot]
СПС! Разобрался!
19 сен 18, 09:36    [21679028]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить