powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А можно как-то сделать SUM() для varchar-a? (-)
23 сообщений из 23, страница 1 из 1
А можно как-то сделать SUM() для varchar-a? (-)
    #34705284
Bormotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705289
AlexSp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Why not...?
Код: plaintext
1.
  
SELECT SUM(CAST(repl_owner as INT)) from constit  

for example
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705295
Bormotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен, спросил кривовато. Но проблема сложить именно символьные строки, а не числа, лежащие как строки.
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705305
AlexSp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно при помощи function
Простите - должен убегать, если не ответят - напишите, пришлю мою function из дому
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705366
laleks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может вам подойдет BinCheckSum?
С уважением
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705368
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BormotunСогласен, спросил кривовато. Но проблема сложить именно символьные строки, а не числа, лежащие как строки.Опять очень плохо сформулировали, что вам нужно.
Для начала прочтите "Top 10, 1. Вопрос". Потому, что у меня есть подозрение, что вам нужно "Top 10, 10. Вопрос".
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705374
Фотография Knyazev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bormotun-

может вам COUNT() нужен?

или так:
Код: plaintext
SELECT SUM(ASHII('MyVal')) FROM MyTable
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705375
Фотография Knyazev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Knyazev Alexey Bormotun-

может вам COUNT() нужен?

или так:
Код: plaintext
1.
SELECT SUM(ASCII('MyVal')) FROM MyTable
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705487
Фотография alexmsp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему Bormotun просто хочет сцепить строковые значения из разных записей с группировкой по какому-то полю но упорно это скрывает :)
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705490
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @t table (f varchar( 10 ))

insert into @t values ('a')
insert into @t values ('b')
insert into @t values ('c')

declare @res varchar( 8000 )
set @res = ''
select @res = @res + f from @t

select @res

Код: plaintext
1.
---------------
abc
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705650
Zeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Жаль только с большими данными не получиться...
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705676
Bormotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даже подумать не мог, что мой вопрос можно трактовать таким количеством способов, сорри! :(

На самом задача такая:

Есть огромный запрос по десятку связанных таблиц, да еще динамический, т.к. количество колонок каждый раз меняется в зависимости от выбранного пользователем периода.
В этом запросе происходит в том числе группировка по нескольким полям для подсчета суммы чч по сотруднику в месяц по задачам. И нужно сформировать колонку комментарий, которая должна представлять из себя строку, сложенную из всех описанний задач, просуммированных для данного сотрудника в данный месяц. Опять не совсем понятно?
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705678
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BormotunИ нужно сформировать колонку комментарий, которая должна представлять из себя строку, сложенную из всех описанний задач, просуммированных для данного сотрудника в данный месяц.
Это то, что показано в моем примере. И, как правильно сказали, ограничение длины будет - в 2000 сиквеле это 8000 символов. Если у вас 2005, то можно написать varchar(MAX) - это повеселее.

BormotunЕсть огромный запрос по десятку связанных таблиц, да еще динамический, т.к. количество колонок каждый раз меняется в зависимости от выбранного пользователем периода.
А вот это надо менять. Это неправильная схема. То есть сделать-то можно - динамический запрос возможно написать, но это плохой подход.
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705688
Bormotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GreenSunriseЭто то, что показано в моем примере. И, как правильно сказали, ограничение длины будет - в 2000 сиквеле это 8000 символов. Если у вас 2005, то можно написать varchar(MAX) - это повеселее.

То, что показано в примере - очевидно, но у меня никак не получается прикрутить что-то подобное к моему запросу :(


Код: plaintext
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
declare @res varchar( 8000 )
set @res = ''

 SELECT	
	
	pa.Name AS ActionName,
вот >>>	@res = @res + pa.Description AS Comment
	ex.Name AS ExecutorName,
	'-' AS Department,
	'-' AS Part,
	 0  AS SortOrder,
	
SUM(CAST (ISNULL(ex.[апр- 07 ], 0 ) AS INT)) AS 'апр-07',
SUM(CAST (ISNULL(ex.[дек- 06 ], 0 ) AS INT)) AS 'дек-06',
SUM(CAST (ISNULL(ex.[июл- 07 ], 0 ) AS INT)) AS 'июл-07'	

FROM
	cis_ProjectBlocks pb
		LEFT OUTER JOIN cis_ProjectActions pa ON pb.ItemID = pa.BlockID
		LEFT OUTER JOIN cis_ProjectTasks pt ON pa.ItemID = pt.ActionID
		INNER JOIN (
			SELECT				 
				pts.TaskID AS TaskID, mhs.*,
				c.ShortName AS Name				 
			FROM
				cis_ProjectTaskSubcontractors pts
				LEFT OUTER JOIN cis_Clients c ON c.ItemID = pts.ClientID LEFT OUTER JOIN (  SELECT
  TaskSubcontractorID,
 CASE Period
 WHEN 'апр-07' THEN Amount
 ELSE NULL
 END AS 'апр-07',
 CASE Period
 WHEN 'дек-06' THEN Amount
 ELSE NULL
 END AS 'дек-06',
 CASE Period
 WHEN 'июл-07' THEN Amount
 ELSE NULL
 END AS 'июл-07'
 FROM cis_ProjectTaskSubcontractorManhours

) mhs ON mhs.TaskSubcontractorID = pts.ItemID) ex ON ex.TaskID = pt.ItemID

WHERE
	pb.ProjectID = 1 

GROUP BY
	 pa.Name, ex.Name


UNION

SELECT	
	
	MAX(pa.Name) AS ActionName,
	'-' AS Descr,
	ex.FIO AS ExecutorName,
	MAX(ex.Department) AS Department,
	MAX(ex.WorkType) AS Part,
	MAX(ex.SortOrder) AS SortOrder,
	
SUM(CAST (ISNULL(ex.[апр- 07 ], 0 ) AS INT)) AS 'апр-07',
SUM(CAST (ISNULL(ex.[дек- 06 ], 0 ) AS INT)) AS 'дек-06',
SUM(CAST (ISNULL(ex.[июл- 07 ], 0 ) AS INT)) AS 'июл-07'	

FROM
	cis_ProjectBlocks pb
		LEFT OUTER JOIN cis_ProjectActions pa ON pb.ItemID = pa.BlockID
		LEFT OUTER JOIN cis_ProjectTasks pt ON pa.ItemID = pt.ActionID
		INNER JOIN (
			SELECT				 
				ptw.TaskID AS TaskID, mh.*,
				w.LastName + ' ' + w.FirstName + ' ' + w.MiddleName AS FIO,
				w.DepartmentID AS Department,
				d.WorkType As WorkType,
				d.SortOrder
			FROM
				cis_ProjectTaskWorkers ptw
				LEFT OUTER JOIN cis_Workers w ON w.ItemID = ptw.WorkerID
				LEFT OUTER JOIN cis_Departments d ON d.ItemID = w.DepartmentID				
				LEFT OUTER JOIN (  SELECT
  TaskWorkerID,
 CASE Period
 WHEN 'апр-07' THEN Amount
 ELSE NULL
 END AS 'апр-07',
 CASE Period
 WHEN 'дек-06' THEN Amount
 ELSE NULL
 END AS 'дек-06',
 CASE Period
 WHEN 'июл-07' THEN Amount
 ELSE NULL
 END AS 'июл-07'
 FROM cis_ProjectTaskWorkerManhours

) mh ON mh.TaskWorkerID = ptw.ItemID) ex ON ex.TaskID = pt.ItemID

WHERE
	pb.ProjectID = 1 

GROUP BY
	 ex.FIO
ORDER BY
	ex.SortOrder, ex.Department

GreenSunrise
А вот это надо менять. Это неправильная схема. То есть сделать-то можно - динамический запрос возможно написать, но это плохой подход.

Уважаемый коллега, а какая правильная? Сделать таблицу о 240 колонках, для каждого месяца по колонке лет на 20? Так конечно проще спору нет, но правильней и красивей ли? Может есть еще какие -то решения, которые я просто не вижу? Буду очень признателен за науку.
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705700
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь ясно, что вы хотели. Ваш пример разбирать не буду - в нем много ошибок. Так это рабоать не будет. Дам свой примерчик в качестве идеи.
Код: plaintext
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.
set nocount on
create table aaa (i int, n int, c varchar( 10 ))
go
create function dbo.str_sum(@i int) returns varchar( 8000 )
begin
  declare @s varchar( 8000 )
  select @s = coalesce(@s+',','') + coalesce(c,'') from aaa where i = @i order by n
  return @s
end
go
insert aaa values( 1 , 1 ,'1')
insert aaa values( 1 , 10 ,'10')
insert aaa values( 1 , 100 ,'100')
insert aaa values( 2 , 2 ,'2')
insert aaa values( 3 , 3 ,'3')
insert aaa values( 3 , 30 ,null)
insert aaa values( 3 , 300 ,'300')
go
select dbo.str_sum( 1 )
select
 i,
 sum_n   = sum(n),
 sum_str = dbo.str_sum(i)
from
  aaa
group by
  i
go
drop function dbo.str_sum
drop table aaa
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705704
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку. У вас таблицы объединяются через left join. Это значит, что среди сцепляемых строк может быть строка со значением null. Т.е, даже если другие строки не null - весь результат сцепления, может быть null. Я вам специально в примере создал такую строку, и добавил запятые, чтобы было ясна проблема и способ ее разрешения.
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705731
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BormotunУважаемый коллега, а какая правильная? Сделать таблицу о 240 колонках, для каждого месяца по колонке лет на 20? Так конечно проще спору нет, но правильней и красивей ли? Может есть еще какие -то решения, которые я просто не вижу? Буду очень признателен за науку.
Ваш пример мне разбирать совершенно влом. Но обычно, когда начинается разговор о динамическом количестве колонок, выясняется, что надо было делать структуру, где добавлялись бы строки, а не колонки.
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705734
Codenamed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BormotunНа самом задача такая

Насколько я понимаю, вы имеете в виду конкатенацию строк? То есть, возможно, захотите потом разделять элементы в строке, скажем, запятыми?

Тогда эта задача должна выполняться агрегатной функцией. Написать ее в SQL 2005 можно только на CLR: ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/denet9/html/bad9b7e8-5967-4afa-8dc8-6d840faf9372.htm

З. Ы. Вариант, предложенный уважаемым Prolog, работает, и на небольшой базе проблем с ним возникнуть не должно. Однако, вызов функции связан с крайне высокими накладными расходами (недавно пришлось столкнуться, тут на форуме это обсуждалось)
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34705756
Bormotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Prolog: Спасибо, теперь понял. Жаль, что без функции никак :(

2 GreenSunrise: Я вовсе не просил разбирать мой пример, а подсказать как без динамических запросов можно решить довольно общую задачу: когда данные о чем либо хранятся в привязке к дате и нужно их получать за разные интервалы времени помесячно. В самой структуре БД конечно добавляются строки вида "дата-значение", но выводить-то их надо где месяц уже столбец...
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34706123
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bormotun
В самой структуре БД конечно добавляются строки вида "дата-значение", но выводить-то их надо где месяц уже столбец...

Вы в сторону WITH CUBE смотрели?
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34706274
Bormotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот МатроскинВы в сторону WITH CUBE смотрели?

Если про это: "Summarizing Data Using CUBE", то смотрел. Возможно в 2005 что-то изменилось, но в 2000 это совсем не то :(
...
Рейтинг: 0 / 0
А можно как-то сделать SUM() для varchar-a? (-)
    #34706668
Asian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PrologТеперь ясно, что вы хотели. Ваш пример разбирать не буду - в нем много ошибок. Так это рабоать не будет. Дам свой примерчик в качестве идеи.
Код: plaintext
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.
set nocount on
create table aaa (i int, n int, c varchar( 10 ))
go
create function dbo.str_sum(@i int) returns varchar( 8000 )
begin
  declare @s varchar( 8000 )
  select @s = coalesce(@s+',','') + coalesce(c,'') from aaa where i = @i order by n
  return @s
end
go
insert aaa values( 1 , 1 ,'1')
insert aaa values( 1 , 10 ,'10')
insert aaa values( 1 , 100 ,'100')
insert aaa values( 2 , 2 ,'2')
insert aaa values( 3 , 3 ,'3')
insert aaa values( 3 , 30 ,null)
insert aaa values( 3 , 300 ,'300')
go
select dbo.str_sum( 1 )
select
 i,
 sum_n   = sum(n),
 sum_str = dbo.str_sum(i)
from
  aaa
group by
  i
go
drop function dbo.str_sum
drop table aaa

данный пример хорош, когда запросом возвращается малое количество строк, т.к. вызов функции будет осуществлен для каждой из них(т.е. ф-я отработает количество раз = количество строк, возвращаемых запросом). Если записей много, лучше создать временную таблицу с полями, запроса, поле comment, при инсерте оставить пустым, затем заполнить его 1 апдейтом. Стоимость такого запроса будет значительно меньше, чем при использовании функции.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
А можно как-то сделать SUM() для varchar-a? (-)
    #40010812
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А можно как-то сделать SUM() для varchar-a? (-)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]