SQL Server 2008 - Fill Same Value Based On The Name - sql

I am working on a query and having a difficult time to figure out how to fill the same value based on one column. Let me explain what I am trying to accomplish....
Says, I have a table like this below with too columns: Name & Value. So, "Select Name, Value FROM Table1 Order By Name" will produce the following result.
Table1
Name Value
AAA 111
AAA
BBB 222
BBB
BBB
BBB
CCC 333
CCC
DDD 444
DDD
DDD
Now, What I am trying to accomplish is producing the result below with the "Select .... from Table1" query.
Table1
Name Value
AAA 111
AAA 111
BBB 222
BBB 222
BBB 222
BBB 222
CCC 333
CCC 333
DDD 444
DDD 444
DDD 444
Please help and provide the sample code if possible.
Thanks in advance

You can use MAX() as a window function:
SELECT Name, Value,
MAX(Value) OVER (PARTITION BY Name) as imputed_name
FROM Table1
ORDER BY Name;

Related

Count common friends/nodes

I have the table1 below and want to make a table that shows how many friends Ent1 has in common with any other person from Ent1.
Eg A (short for AAA) has friends B,C,D,E,F while B has friends A,C,E,F. They have C,E,F in common so the outcome should be AAA BBB 3
Can this be done in acces/SQL? I have no clue ...
Table1
Ent1 Ent2 link
AAA BBB friend
AAA CCC friend
AAA DDD friend
AAA EEE friend
AAA FFF friend
BBB AAA friend
BBB CCC friend
BBB EEE friend
BBB FFF friend
CCC AAA friend
CCC BBB friend
CCC EEE friend
CCC FFF friend
DDD AAA friend
DDD KKK friend
DDD LLL friend
EEE AAA friend
EEE BBB friend
EEE CCC friend
FFF AAA friend
FFF BBB friend
FFF CCC friend
KKK DDD friend
LLL DDD friend
The outcome should be :
AAA BBB 3
AAA CCC 3
AAA DDD 0
AAA EEE 2
AAA FFF 2
AAA KKK 1
AAA LLL 1
BBB CCC 3 etc...
Yeah, it can be done. I kinda hate your table and I feel like it could be normalized into two tables to work better but I'm not coming up with how right now. So here's how to do it with your current table in SQL mode:
select s.Person_1, s.Person_2, count(*) as tot
from
(select
a.Ent1 as Person_1
, a.Ent2 as Common_friend
, b.Ent1 as Person_2
from [Table1] as a
inner join [Table1] as b
on a.ent2 = b.ent2
where a.ent1 <> b.ent1) as s
group by s.Person_1, s.Person_2
The way this works is that the subtable s gets all the links you want to count by self-joining your table (the where a.ent1 <> b.ent1 makes it so you don't count a person as linked to themself). Then the outer query counts the number of links between pairs. This code will give pseudo-duplicates as it counts a link between AAA as the first person and BBB as the second person as different from BBB as the first person and AAA as the second person. I'm not coming up with an easy way to fix that, but you the data you want will be there.

Find all parent and child with a relationship table

I have inherited two tables:
Table 1: Loc
LocID Field1 Field2
---------------------------
1 AAA BBB
2 CCC DDD
3 EEE FFF
4 GGG HHH
5 III JJJ
6 KKK LLL
7 MMM NNN
8 OOO PPP
9 QQQ RRR
10 SSS TTT
11 UUU VVV
Table 2: LocRel
LocID_A LocID_B
-----------------------
1 2
1 3
2 4
2 5
3 6
3 7
5 11
8 9
8 10
So, the LocRel table basically is used to specified the relationships between the various records in the Loc table.
I am struggling with writing a sql statement that will list all the relationships like so:
LocID Level LocIDH_Ancestry Field1 Field2
---------------------------------------------------
1 1 NULL AAA BBB
2 2 1 CCC DDD
3 2 1 EEE FFF
4 3 1,2 GGG HHH
5 3 1,2 III JJJ
6 3 1,3 KKK LLL
7 3 1,3 MMM NNN
8 1 NULL OOO PPP
9 2 8 QQQ RRR
10 2 8 SSS TTT
11 4 1,2,5 UUU VVV
I am not good at all in queries involving relationships, and would really appreciate some help on how the above can be achieved.
Thank you to all!
This answer may be SQL Server specific. I'm not an expert in SQL, so I don't know how much of this is standard and/or adopted in other dbms.
You can implement the kind of queries you mentioned, using recursive queries. Here is a intro to the subject that provides a good starting point.
For your specific query, something like this should do the work.
WITH MyCTE AS
(
SELECT
LocID, 1 as Level,
NULL as LocIDH_Ancestry,
Field1, Field2
FROM
Table1
WHERE
LocID NOT IN (SELECT LocID_B FROM Table2)
UNION ALL
SELECT
t1.LocID,
c.Level + 1 as Level,
t2.LocID_A as LocIDH_Ancestry,
t1.Field1, t1.Field2
FROM
Table1 t1
INNER JOIN
Table2 t2 ON t1.LocID = t2.LocID_A
INNER JOIN
MyCTE c ON t2.LocID_B = c.LocID
)
SELECT *
FROM MyCTE
Hope that helps.

update query question

i have this table MEN
Fname
aaa
bbb
ccc
aaa
aaa
bbb
ggg
i need query that replace all the aaa - in - ZZZ
Fname
ZZZ
bbb
ccc
ZZZ
ZZZ
bbb
ggg
how to do it on Oracle query ?
thanks in advance
Will work not only in Oracle
update MEN
set Fname='ZZZ'
where Fname='aaa';
UPDATE MEN SET Fname='ZZZ' WHERE Fname='aaa';
see http://psoug.org/reference/update.html

How to get unique result in mysql

I have table:
name marks
aaa 100
aaa 56
aaa 120
bbb 56
bbb 60
The result should be:
aaa 120
bbb 60
ie unique name with maximum marks. Is there any query in mysql?
SELECT name, MAX(marks) marks
from table
group by name

MSAccess: Ranking rows based upon column criteria

I have a dataset that looks like this:
Account Cost Centre TransNo
aaa 111 43443
aaa 111 32112
aaa 111 43211
aaa 112 32232
aaa 113 56544
bbb 222 43222
bbb 222 98332
ccc 111 88778
I need a column added that is a counter of the number of rows that relate to that Account/Cost Centre combination:
Account Cost Centre TransNo rCounter
aaa 111 43443 1
aaa 111 32112 2
aaa 111 43211 3
aaa 112 32232 1
aaa 112 56544 2
bbb 222 43222 1
bbb 222 98332 2
ccc 111 88778 1
Is this possible to do in MSAccess using SQL? and how would I go about it (ie what would be the SQL script I would need to write)?
Thanks in advance.
Something like:
SELECT a.Account, a.[Cost Centre], a.TransNo, (SELECT Count(*)
FROM table4 b
WHERE b.Account=a.Account
AND b.[Cost Centre]=a.[Cost Centre]
AND b.TransNo<=a.TransNo) AS AccountNo
FROM Table4 AS a
ORDER BY a.Account, a.[Cost Centre], a.TransNo;