Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Taking each row from one table and summing up the "hits" in a second table

Tags:

sql

sql-server

Pretty complicated... I have two tables, t1 which contains descriptive information regarding specific objects, and the second table, t2, contains information used to decode the objects in t1.

I'll try to provide a simple example:

----
t1 (Name, Type, Size, Color)
----
dog1 - mammal - big  -  brown

dog2 - mammal - big  -  black

cat1 - mammal - small - black

fish1 - fish - small - gold


---
t2 (Type, Size, Color, Value)
---
mammal - "" - blue - 1

mammal - big - brown - 0.5

mammal - big - black - 0.75

mammal - small - "" - 2

fish - big - "" - 5

fish - small - "" - 0.5

fish - small - gold - 0.5

"" - "" - black - 1

"" - big - "" - 0.75

---
result(name, value)
---
dog1 - 1.25 //receives a value of 1.25 (0.5+0.75) because it hits the row of being mammal/big/brown (0.5) and the extra hit of just being big (0.75)

dog2 - 2.5 // 0.75 + 1 + 0.75 for being mammal/big/black (0.75), for being black (1), and for being big (0.75)

cat1 - 2 //2 for being mammal/small

fish1 - 1 // 0.5 + 0.5 for being fish/small and fish/small/gold

---

This is my current query as it pertains to this example, but of course it doesn't work for several reasons.

Select t1.Name, SUM(counter.Value) as Sums
 From
 (Select *
 From t1, t2
 where t1.Type = t2.Type and t1.Size = t2.Size and t1.Color = t2.Color)
like image 544
user1721626 Avatar asked Jan 18 '26 09:01

user1721626


1 Answers

Try this (or replace the t2.XXX is null with t2.XXX = '' if you're using blanks):

declare @t1 table(name nvarchar(32), [type] nvarchar(32), size nvarchar(32), colour nvarchar(32))
declare @t2 table([type] nvarchar(32), size nvarchar(32), colour nvarchar(32), value numeric(15,9))

insert @t1
          select 'dog1','mammal','big','brown'
union all select 'dog2','mammal','big','black'
union all select 'cat1','mammal','small','black'
union all select 'fish1','fish','small','gold'

insert @t2
          select 'mammal',null,'blue',1
union all select 'mammal','big','brown',0.5
union all select 'mammal','big','black',0.75
union all select 'mammal','small',null,2
union all select 'fish','big',null,5
union all select 'fish','small',null,0.5
union all select 'fish','small','gold',0.5
union all select null,null,'black',1
union all select null,'big',null,0.75

select t1.name, sum(t2.value) Value
from @t1 t1
inner join @t2 t2
on (t1.type = t2.type or t2.type is null)
and (t1.colour = t2.colour or t2.colour is null)
and (t1.size = t2.size or t2.size is null)
group by t1.name

Results:

name    Value
cat1    3.000000000
dog1    1.250000000
dog2    2.500000000
fish1   1.000000000
like image 100
JohnLBevan Avatar answered Jan 20 '26 23:01

JohnLBevan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!