Noman Suleman Ответов: 2

Как суммировать два значения столбца/строки на основе идентификатора в SQL-запросе


Я хочу суммировать значение строк в запросе на основе условия
например

количество идентификаторов
1 125
2 3
3 111
32 169


я хочу суммировать, где id=2 и id=32 эти два значения строк могут суммироваться
любить
количество идентификаторов
1 125
2 171 (3+169)
3 111

пожалуйста, подскажите мне, как я могу это сделать

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

select s.ShowCauseStatusId, s.CountA, case  when s.ShowCauseStatusId =2 or s.ShowCauseStatusId =32 then SUM(CountA)  else  ' '  end as d from ( select

                ipgc.ShowCauseStatusId
               ,count(*) as CountA

                from dbo.MemoIntellectualPropertyGoodsClass mipgc

                left join dbo.IntellectualPropertyGoodsClass ipgc on mipgc.IntellectualPropertyGoodsClassId = ipgc.Id and ipgc.DataEntryStatusId=1

                left join dbo.MemoIntellectualProperty mip on mipgc.MemoProductId = mip.Id and mip.DataEntryStatusId=1

                left join dbo.IntellectualProperty ip on ipgc.IntellectualPropertyId = ip.Id and ip.DataEntryStatusId=1

                left join dbo.Memo m on mip.MemoId = m.Id and m.DataEntryStatusId=1

                left join dbo.GoodsClass gc on ipgc.GoodsClassId = gc.Id and gc.DataEntryStatusId=1

                left join dbo.Corporate c on ip.ProductCorporateId = c.Id and c.DataEntryStatusId=1

                left join dbo.ContactPerson cp on c.AccountManagerId = cp.Id and cp.DataEntryStatusId=1

                left join dbo.StatusCorrespondence sc on ipgc.StatusId = sc.Id and sc.DataEntryStatusId=1

                left join dbo.TrademarkLetterRemark ltr on ipgc.LetterRemarkId = ltr.Id

                where mipgc.DataEntryStatusId = 1

                and ip.IntellectualPropertyTypeId = 4

                and m.IntellectualPropertyCaseTypeId = 1

               
                and (ipgc.StatusId = 9)
					and c.CorporateStatusId=1
			and (ipgc.ShowCauseStatusId in (1,2,3) 
			or ipgc.StatusId=32)
					and c.CorporateStatusId=1
and ipgc.ApplicationNumber is not null
			 group by ipgc.ShowCauseStatusId 
             

				union all
				select

                ipgc.StatusId 
                ,count(*) as Count


                from dbo.MemoIntellectualPropertyGoodsClass mipgc

                left join dbo.IntellectualPropertyGoodsClass ipgc on mipgc.IntellectualPropertyGoodsClassId = ipgc.Id and ipgc.DataEntryStatusId=1

                left join dbo.MemoIntellectualProperty mip on mipgc.MemoProductId = mip.Id and mip.DataEntryStatusId=1

                left join dbo.IntellectualProperty ip on ipgc.IntellectualPropertyId = ip.Id and ip.DataEntryStatusId=1

                left join dbo.Memo m on mip.MemoId = m.Id and m.DataEntryStatusId=1

                left join dbo.GoodsClass gc on ipgc.GoodsClassId = gc.Id and gc.DataEntryStatusId=1

                left join dbo.Corporate c on ip.ProductCorporateId = c.Id and c.DataEntryStatusId=1

                left join dbo.ContactPerson cp on c.AccountManagerId = cp.Id and cp.DataEntryStatusId=1

                left join dbo.StatusCorrespondence sc on ipgc.StatusId = sc.Id and sc.DataEntryStatusId=1

                left join dbo.TrademarkLetterRemark ltr on ipgc.LetterRemarkId = ltr.Id

                where mipgc.DataEntryStatusId = 1

                and ip.IntellectualPropertyTypeId = 4

                and m.IntellectualPropertyCaseTypeId = 1

               
              --  and (ipgc.StatusId = 9)
					and c.CorporateStatusId=1
			and  ipgc.StatusId=32
					and c.CorporateStatusId=1
and ipgc.ApplicationNumber is not null
			
                group by ipgc.StatusId

				 ) as s

Mohibur Rashid

Почему вы выбрали 2 и 32? почему вы показываете 2 в качестве идентификатора?

Noman Suleman

да, я заменил 32 на 2, тогда это работает.

2 Ответов

Рейтинг:
6

LEOH88

Попробовать это

SELECT [id], SUM([count]) AS [count]
FROM (
		SELECT (CASE [id] WHEN 32 THEN 2 ELSE [id] END) AS [id], [count]
		FROM [YourTable]) AS result
GROUP BY [id]


Noman Suleman

спасибо за ответ

Рейтинг:
20

jaket-cp

Не уверен на 100% , что вы просите.
Но если вы пытаетесь получить сумму count для id, где самое правое число совпадает, то вот способ сделать это в tsql.

with CntAll as (
	select 1 id, 125 cnt
	union select 2, 3
	union select 3, 111
	union select 32, 169
)
select 
	right(id, 1) rightid,
	sum(cnt) SumCnt
from CntAll
group by
	right(id, 1)
;
--what you will get
--rightid	SumCnt
--1	125
--2	172
--3	111

--Also would like to mention 3+169 = 172 and not 171, I assume a typo


--similar to above but not grouping by right(id, 1) but getting it as a sub type query and grouping the rightid instead - maybe faster execution time
with CntAll as (
	select 1 id, 125 cnt
	union select 2, 3
	union select 3, 111
	union select 32, 169
), CntWithRightId as (
	select 
		right(id, 1) rightId,
		id,
		cnt
	from CntAll
)
select 
	rightid,
	sum(cnt) SumCnt
from CntWithRightId
group by
	rightid
;

Надеюсь, это вам поможет.


Noman Suleman

спасибо приятель за руководство

jaket-cp

рад помочь :)