ahmed_sa Ответов: 2

Как сделать агрегатный подсчет на основе имени функции ?


Как сделать агрегатный подсчет на основе имени функции ?
Мне нужно возобновить мой запрос ниже или добавить код к моему коду ниже
Мне нужно агрегировать по имени функции
во втором столбце CountDoneCode - это make count to 1 на основе имени функции
в третьем столбце CountNotDoneCode делает счетчик равным 0 на основе имени функции

Конечный результат, который мне нужен, таков
FunctionName	CountDoneCode	CountNotDoneCode
------------    -------------   ----------------
Lifecycle	           3	    0
Rohs	               0	    3
Reach	               3	    0
FMD	                   1	    2
Parametric	           1	    2
Package                3	    0
IntroductionDate       2	    1
MFG	                   2	    1
Qualification	       2	    1


Что я уже пробовал:

create table #Donecode (
  FunctionId   int,
  FunctionName nvarchar(50)
)
insert into #Donecode
values
(1,'Lifecycle'),
(2,'Rohs'),
(3,'Reach'),
(4,'FMD'),
(5,'Parametric'),
(6,'Package'),
(7,'IntroductionDate'),
(8,'MFG'),
(9,'Qualification')

create table #filedetails (
  FileID   int,
  DoneCode nvarchar(50)
)
insert into #filedetails (FileID,DoneCode) 
values 
(3301,'101011111'),
(3301,'101101111'),
(3301,'101001000')

select  substring (Donecode,1,1) as Lifecycle,
        substring (Donecode,2,1) as Rohs,
        substring (Donecode,3,1) as Reach,
        substring (Donecode,4,1) as FMD,
        substring (Donecode,5,1) as Parametric,
        substring (Donecode,6,1) as Package,
        substring (Donecode,7,1) as IntroductionDate,
        substring (Donecode,8,1) as MFG,
        substring (Donecode,9,1) as Qualification
into #FunctionsDiv
from #filedetails
where  DoneCode is not NULL 
and    fileid=3301

declare @SeletColumnComma varchar(max)

select @SeletColumnComma = coalesce(@SeletColumnComma + ',','')
                         + coalesce('substring(DoneCode ,' + cast (FunctionId as nvarchar(20)) + ',1) as ' + FunctionName + '','')
from   #Donecode

select @SeletColumnComma

DECLARE @query nvarchar(max)
SET     @query='select ' + @SeletColumnComma  + '  from #filedetails where DoneCode is not null '
exec    (@query)

drop table #filedetails
drop table #Donecode
drop table #FunctionsDiv

MadMyche

Это заняло всего несколько минут, чтобы отформатировать ваш пост, и теперь, когда он выглядит несколько разумным, возможно, некоторые люди попытаются вам помочь.
Если вы не можете выкроить время, чтобы красиво опубликовать свой вопрос; что заставляет вас думать, что люди будут тратить время, пытаясь помочь вам?

Patrice T

Ахмед-это всего лишь 260+ вопросов по этому поводу. Я думаю, он никогда не научится.

MadMyche

Я прекрасно это понимаю... И я думаю, что уже нашел 2 или 3 различных способа переписать это

2 Ответов

Рейтинг:
9

Maciej Los

Взгляните на пример:

DECLARE @Donecode TABLE(FunctionId int, FunctionName nvarchar(50))
insert into @Donecode(FunctionId, FunctionName)
values(1,'Lifecycle'),(2,'Rohs'),(3,'Reach'),(4,'FMD'),(5,'Parametric'),
(6,'Package'),(7,'IntroductionDate'),(8,'MFG'),(9,'Qualification')

DECLARE @filedetails  TABLE(FileID   int, DoneCode nvarchar(50))
insert into @filedetails (FileID,DoneCode) 
values (3301,'101011111'), (3301,'101101111'), (3301,'101001000')

;WITH CTE AS
(
	--initial part
	SELECT FileID, 1 AS FunctionId, CONVERT(INT, LEFT(DoneCode, 1)) AS MyValue, RIGHT(DoneCode, LEN(DoneCode)-1) AS Remainder, ROW_NUMBER() OVER(ORDER BY FileID) AS RowNo
	FROM @filedetails
	--recursive part
	UNION ALL
	SELECT FileID, FunctionId + 1 AS FunctionId, CONVERT(INT, LEFT(Remainder, 1)) AS MyValue, RIGHT(Remainder, LEN(Remainder)-1) AS Remainder, RowNo AS RowNo
	FROM CTE
	WHERE LEN(Remainder)>0
)
SELECT dc.FunctionName, SUM(CASE WHEN c.MyValue = 1 THEN 1 ELSE 0 END) AS CountDoneCode, SUM(CASE WHEN c.MyValue = 0 THEN 1 ELSE 0 END) AS CountNotDoneCode
FROM CTE c INNER JOIN @Donecode dc ON c.FunctionId = dc.FunctionId 
GROUP BY dc.FunctionId, dc.FunctionName
ORDER BY dc.FunctionId


Я уже использовал КТОС[^] разделять DoneCode на части.

Результат:
FunctionName	CountDoneCode	CountNotDoneCode
Lifecycle			3			0
Rohs				0			3
Reach				3			0
FMD					1			2
Parametric			1			2
Package				3			0
IntroductionDate	2			1
MFG					2			1
Qualification		2			1


Удачи вам!

Кстати: ваша структура базы данных такова... недействительный.


Рейтинг:
17

OriginalGriff

Вы находитесь здесь уже десять лет, вы задали 267 вопросов, и за все это время, за все усилия, приложенные добровольцами, вы не проявили ни малейшей попытки узнать что-либо из того, что мы вам рассказали.

Это тривиальная задача, и она напоминает некоторые из тех, которые, как я помню, вы задавали раньше.
Так скажи мне, почему мы должны тратить наше время на дальнейшее содержание вампира-помощника на работе, для которой он не только не квалифицирован, но и не хочет быть образованным, чтобы соответствовать?

Убедите меня, что вы учитесь, что вы действительно пытаетесь совершенствоваться, и я, возможно, помогу Вам. Но на данный момент я, например, покончил с тобой.


Patrice T

Согласен, мой 5-й

Maciej Los

5 в степени количества вопросов, задаваемых ОП!

ahmed_sa

большое вам спасибо за помощь за поддержку
Я действительно получаю больше пользы от этого форума так много
и я так много узнаю .
иногда я задаю вопросы, чтобы получить более эффективный ответ на свои вопросы
Хорошо я понимаю о чем вы говорите выше и буду совершенствовать себя
мне нужен ответ только на один вопрос
вы путаете, потому что задача тривиальна или Я не пытаюсь .
пожалуйста, скажите мне, что я должен учиться на своей ошибке, чтобы не повторять ее снова ?

OriginalGriff

"Я действительно получаю больше пользы от этого форума так много
и я так много узнаю ."
Нет, это не так. В этом вся проблема, и это то, что неоднократно поднималось с вами.
Ты ничему не учишься. Вы даже не пытаетесь учиться, потому что задаете одни и те же основные вопросы снова и снова.
И нет никакого смысла тратить наше время, пытаясь помочь кому-то, кто вообще не хочет учиться, просто решить его текущую проблему, чтобы он мог перейти к следующей.

ahmed_sa

Хорошо я понимаю

MadMyche

Вы также можете включить меня в список +5 клуб.

Это также расстраивает, что, когда вопрос получает ответ, вы не говорите спасибо или иным образом подтверждаете его.
Время, которое уходит на расшифровку того, что вы написали, и форматирование неаккуратного кода, чтобы я мог попытаться помочь, на самом деле занимает больше времени, чем фактическая проблема кода. Если бы это был оплачиваемый труд, то стоимость в мое время (и моего работодателя) составляет буквально тысячи долларов.