Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 26th, 2012  |  syntax: None  |  size: 5.27 KB  |  hits: 7  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. SQL Query question - How to select groups of rows using commonalities
  2. select streetaddress, count(*) as occupantcount
  3.        from census
  4.        where firstname in ("Julia", "Hannah", "Helen")
  5.        group by streetaddress
  6.        order by occupantcount desc
  7.        
  8. SELECT Address, FamilyName, Forename
  9. FROM   YourTable
  10. WHERE  Address IN (SELECT Address
  11.                    FROM   YourTable
  12.                    WHERE  Forename IN ( 'Julia', 'Hannah', 'Helen' )
  13.                    GROUP  BY Address
  14.                    HAVING COUNT(DISTINCT Forename) = 3)
  15.        
  16. WITH Names(name)
  17.      AS (SELECT 'Julia'
  18.          UNION ALL
  19.          SELECT 'Hannah'
  20.          UNION ALL
  21.          SELECT 'Helen')
  22. SELECT Address,
  23.        FamilyName,
  24.        Forename
  25. FROM   YourTable y1
  26. WHERE  NOT EXISTS (SELECT *
  27.                    FROM   Names n
  28.                    WHERE  NOT EXISTS(SELECT *
  29.                                      FROM   YourTable y2
  30.                                      WHERE  y1.Address = y2.Address
  31.                                             AND y2.Forename = n.Name))
  32.        
  33. SELECT A.*
  34. FROM YourTable A
  35. JOIN (  SELECT Address, COUNT(*) Quant
  36.         FROM YourTable
  37.         WHERE Forename IN ('Julia','Hannah','Helen')
  38.         GROUP BY Address
  39.         HAVING COUNT(DISTINCT Forename) > 2) B
  40. ON A.Address = B.Address
  41.        
  42. SELECT a.Address as CommonAddress
  43. FROM (SELECT Address FROM Names WHERE Forename = 'Julia') a
  44. INNER JOIN (SELECT Address FROM Names WHERE Forename = 'Richard') b ON a.Address=b.Address
  45. INNER JOIN (SELECT Address FROM Names WHERE Forename = 'Helen') c on b.Address=c.Address
  46.        
  47. declare @people table (
  48.     address varchar(255),
  49.     familyName varchar(255),
  50.     forename varchar(255)
  51. )
  52.  
  53. insert into @people
  54. values ('Residents of a house 2 in Janemount Lower (Cork No. 4 Urban (part of), Cork)', 'Gamble', 'Julia')
  55. insert into @people
  56. values ('Residents of a house 2 in Janemount Lower (Cork No. 4 Urban (part of), Cork)', 'Gamble', 'Richard')
  57. insert into @people
  58. values ('Residents of a house 2 in Janemount Lower (Cork No. 4 Urban (part of), Cork)', 'Gamble', 'Hannah')
  59. insert into @people
  60. values ('Residents of a house 2 in Janemount Lower (Cork No. 4 Urban (part of), Cork)', 'Gamble', 'Helen')
  61. insert into @people
  62. values ('Residents of a house 2 somewhere else (Cork No. 4 Urban (part of), Cork)', 'Cooper', 'Helen')
  63.  
  64. select people.*
  65. from @people as people
  66. where people.address in (
  67.     select address
  68.     from @people
  69.     where forename in ('Julia', 'Hannah', 'Helen')
  70.     group by address
  71.     having count(forename) >= 3 -- This must be equal to the number of names searched for
  72. )
  73.        
  74. SELECT t.address
  75.      , t.familyname
  76.      , t.forename
  77.   FROM yourTable t
  78.   WHERE t.address IN
  79.     -- search subquery
  80.     ( SELECT s1.address
  81.         FROM yourTable s1
  82.           JOIN yourTable s2
  83.             ON s2.address = s1.address
  84.           JOIN yourTable s3
  85.             ON s3.address = s1.address
  86.         WHERE s1.forename = "Julia"
  87.           AND s2.forename = "Hannah"
  88.           AND s3.forename = "Helen"
  89.     )
  90.   ORDER BY t.address
  91.          , t.familyname
  92.          , t.forename
  93. ;
  94.        
  95. SELECT t.address
  96.      , t.familyname
  97.      , t.forename
  98.   FROM yourTable t
  99.   WHERE EXISTS
  100.     -- search subquery
  101.     ( SELECT *
  102.         FROM yourTable s1
  103.           JOIN yourTable s2
  104.             ON s2.address = s1.address
  105.           JOIN yourTable s3
  106.             ON s3.address = s1.address
  107.         WHERE s1.forename = "Julia"
  108.           AND s2.forename = "Hannah"
  109.           AND s3.forename = "Helen"
  110.           AND s1.address = t.address
  111.     )
  112.   ORDER BY t.address
  113.          , t.familyname
  114.          , t.forename
  115. ;
  116.        
  117. SELECT t.address
  118.      , t.familyname
  119.      , t.forename
  120.   FROM yourTable t
  121.   WHERE  -- search subqueries
  122.     EXISTS
  123.       ( SELECT *
  124.           FROM yourTable s1
  125.             WHERE s1.forename= "Julia"
  126.               AND s1.address = t.address
  127.       )
  128.     AND EXISTS
  129.       ( SELECT *
  130.           FROM yourTable s2
  131.             WHERE s2.forename = "Hannah"
  132.               AND s2.address = t.address
  133.       )
  134.     AND EXISTS
  135.       ( SELECT *
  136.           FROM yourTable s3
  137.             WHERE s3.forename = "Helen"
  138.               AND s3.address = t.address
  139.       )
  140.   ORDER BY t.address
  141.          , t.familyname
  142.          , t.forename
  143. ;
  144.        
  145. DECLARE @namecount int;
  146. DECLARE @forenames TABLE (name varchar(50));
  147. INSERT INTO @forenames
  148. VALUES ('...'),
  149.        ('...'),
  150.        ('...');
  151. SELECT @namecount = COUNT(*) FROM @forenames;
  152.  
  153. /* list all people by addresses that are shared by people
  154.    whose forenames are included in @forenames */
  155. SELECT cd.*
  156. FROM CensusData cd
  157.   INNER JOIN (
  158.     SELECT d.Address
  159.     FROM CensusData d
  160.       INNER JOIN @forenames f ON d.Forename = f.Name
  161.     GROUP BY d.Address
  162.     HAVING COUNT(DISTINCT d.Forename) >= @namecount
  163.   ) filter ON cd.Address = filter.Address
  164.  
  165. /* same for family names */
  166. SELECT cd.*
  167. FROM CensusData cd
  168.   INNER JOIN (
  169.     SELECT d.[Family Name]
  170.     FROM CensusData d
  171.       INNER JOIN @forenames f ON d.Forename = f.Name
  172.     GROUP BY d.Address
  173.     HAVING COUNT(DISTINCT d.Forename) >= @namecount
  174.   ) filter ON cd.[Family Name]= filter.[Family Name]
  175.  
  176. /* and so on fro other criteria */
  177.        
  178. select *
  179. from dataset
  180. where address = (
  181.     select address
  182.     from dataset
  183.     where famly_name = 'Hannah' and forename = 'Gamble'
  184. )
  185.        
  186. Select
  187.     T1.*
  188. From
  189.     TableName T1
  190. Inner Join
  191.     TableName T2
  192. On
  193.     T1.Address = T2.Address
  194. Where
  195.     T1.ForeName = 'Julia'