使用Group BY访问SQL多个联合

使用Group BY访问SQL多个联合,sql,ms-access,group-by,inner-join,union-all,Sql,Ms Access,Group By,Inner Join,Union All,我正在尝试运行此查询: SELECT HH.`Household id` AS HH_HH_ID, HH.`Annualized Premium Amount` AS HH_Annualized_Premium, GQ.`Referal SRC Id` AS GQ_Source_ID, count(*) AS Total_HH FROM Households HH INNER JOIN GatewayQ GQ ON GQ.`Househo

我正在尝试运行此查询:

SELECT
    HH.`Household id` AS HH_HH_ID,
    HH.`Annualized Premium Amount` AS HH_Annualized_Premium,
    GQ.`Referal SRC Id` AS GQ_Source_ID,
    count(*) AS Total_HH
FROM
    Households HH 
INNER JOIN
    GatewayQ GQ
ON
    GQ.`Household Id` = HH.`Household id`
UNION ALL
SELECT 
    HH.`Household id` AS HH_HH_ID, 
    HH.`Annualized Premium Amount` AS HH_Annualized_Premium, 
    GQ.`Referal SRC Id` AS GQ_Source_ID,
    count(*) AS Total_HH 
FROM 
    Households HH 
INNER JOIN 
    GatewayQ GQ 
ON 
    GQ.`Email`= HH.`Email`
UNION ALL
SELECT 
    HH.`Household id` AS HH_HH_ID, 
    HH.`Annualized Premium Amount` AS HH_Annualized_Premium, 
    GQ.`Referal SRC Id` AS GQ_Source_ID,
    count(*) AS Total_HH
FROM 
    Households HH 
INNER JOIN 
    GatewayQ GQ 
    ON GQ.`Zip`= HH.`Zip` AND
    GQ.`Last Name`= HH.`Last Name` AND
    GQ.`First Name`= HH.`First Name`
GROUP BY 
    GQ_Source_ID
HAVING 
    GQ_Source_ID LIKE 'ps%'
ORDER BY 
    GQ.`Referal SRC Id`, HH_Annualized_Premium ASC;
当我尝试在Access中运行时,会收到一条消息,表明我的ORDER BY表达式包含查询未选择的字段。我不明白为什么我会得到这个,当我清楚地选择了所有3个选择中的所有Col

我想得到的是,从所有3个表中得到一个保费总额和一个独特的家庭数(由家庭id定义),第一个表匹配家庭id,第二个表匹配电子邮件地址,最后一个表匹配姓氏和邮政编码。如果在3个不同的匹配之后有一个重复,我希望以“ps”开头的源id获得积分,并将保费添加到所有保费的运行总数中,家庭增加一个,忽略其余重复项。如果GQ_Source_ID不包含ps,它可能是其他6个值中的一个,我确实关心这些值是什么,但是有大约300个ps的“味道”,我不想知道每个,只是它是以ps开头的

示例表:

HHID    |HHPremium     |REfSrc
1       |100.00        |g1
1       |150.00        |ps1
2       |125.00        |r1
1       |100.00        |ps167
4       |100.00        |y1
4       |160.00        |g1
3       |100.00        |r1
4       |100.00        |y1
9       |140.00        |ps61
2       |100.00        |g1
7       |150.00        |ps1
4       |170.00        |r1
期望输出:

HHID    |HHPremium     |REfSrc     |HHCount
1       |360.00        |g1         |3
1       |440.00        |ps*        |3
2       |395.00        |r1         |3
4       |100.00        |y1         |1
逻辑:

--(由于g1 RefSrc匹配,且HHID是唯一的,因此对第1、6和10行进行分组,将其溢价添加到总数中,并且每行HH计数增加1)

--(由于第2行、第4行、第9行和第11行中的ps%RefSrc匹配,但第2行和第4行中的hhid不是唯一的,第4行被删除且未计数,因此我们只对第2行、第9行和第11行进行计数和求和)

--(因为第3行、第7行和第12行中的r1 RefSrc匹配,并且HHID是唯一的,所以HHCUNT将递增,HHPRIMIUM将相加到总数中)

--(最后,第5行和第8行中的REfSrc y1有一个重复的HHID,因此我们计算第一个实例并消除第二个实例)


我哪里出错了?

联盟中的每个选择都是独立的。a group by需要应用于3个非聚合字段的每个查询

我将查询转移到外部查询,因为它应用于union的结果,并将union ed表用作内联视图;然后在外部select上将having子句更改为where子句

我不认为ms access使用反勾号来表示列名,所以用括号
[]
代替。我将您的订单从
GQ.Referal SRC Id
修改为
GQ\u Source\u Id
,因为它现在引用的是内联视图

SELECT Z.* 
FROM (SELECT HH.[Household id] AS HH_HH_ID,
             HH.[Annualized Premium Amount] AS HH_Annualized_Premium,
             GQ.[Referal SRC Id] AS GQ_Source_ID,
             count(*) AS Total_HH
      FROM Households HH 
      INNER JOIN GatewayQ GQ
       ON GQ.[Household Id] = HH.[Household id]
      GROUP BY HH.[Household id]
             , HH.[Annualized Premium Amount]
             , GQ.[Referal SRC Id]
      UNION ALL
      SELECT HH.[Household id] AS HH_HH_ID, 
             HH.[Annualized Premium Amount] AS HH_Annualized_Premium, 
             GQ.[Referal SRC Id] AS GQ_Source_ID,
             count(*) AS Total_HH 
      FROM  Households HH 
      INNER JOIN GatewayQ GQ 
        ON GQ.Email= HH.Email
      GROUP BY HH.[Household id]
             , HH.[Annualized Premium Amount]
             , GQ.[Referal SRC Id]
      UNION ALL
      SELECT HH.[Household id] AS HH_HH_ID, 
             HH.[Annualized Premium Amount] AS HH_Annualized_Premium, 
             GQ.[Referal SRC Id] AS GQ_Source_ID,
             count(*) AS Total_HH
      FROM Households HH 
      INNER JOIN GatewayQ GQ 
        ON GQ.Zip= HH.Zip
       AND GQ.[Last Name]= HH.[Last Name]
       AND GQ.[First Name]= HH.[First Name]
      GROUP BY HH.[Household id]
             , HH.[Annualized Premium Amount]
             , GQ.[Referal SRC Id]) Z
WHERE Z.GQ_Source_ID LIKE 'ps%'
ORDER BY Z.GQ_Source_ID
       , Z.HH_Annualized_Premium ASC;

联合体中的每个select都独立于其他select。a group by需要应用于3个非聚合字段的每个查询

我将查询转移到外部查询,因为它应用于union的结果,并将union ed表用作内联视图;然后在外部select上将having子句更改为where子句

我不认为ms access使用反勾号来表示列名,所以用括号
[]
代替。我将您的订单从
GQ.Referal SRC Id
修改为
GQ\u Source\u Id
,因为它现在引用的是内联视图

SELECT Z.* 
FROM (SELECT HH.[Household id] AS HH_HH_ID,
             HH.[Annualized Premium Amount] AS HH_Annualized_Premium,
             GQ.[Referal SRC Id] AS GQ_Source_ID,
             count(*) AS Total_HH
      FROM Households HH 
      INNER JOIN GatewayQ GQ
       ON GQ.[Household Id] = HH.[Household id]
      GROUP BY HH.[Household id]
             , HH.[Annualized Premium Amount]
             , GQ.[Referal SRC Id]
      UNION ALL
      SELECT HH.[Household id] AS HH_HH_ID, 
             HH.[Annualized Premium Amount] AS HH_Annualized_Premium, 
             GQ.[Referal SRC Id] AS GQ_Source_ID,
             count(*) AS Total_HH 
      FROM  Households HH 
      INNER JOIN GatewayQ GQ 
        ON GQ.Email= HH.Email
      GROUP BY HH.[Household id]
             , HH.[Annualized Premium Amount]
             , GQ.[Referal SRC Id]
      UNION ALL
      SELECT HH.[Household id] AS HH_HH_ID, 
             HH.[Annualized Premium Amount] AS HH_Annualized_Premium, 
             GQ.[Referal SRC Id] AS GQ_Source_ID,
             count(*) AS Total_HH
      FROM Households HH 
      INNER JOIN GatewayQ GQ 
        ON GQ.Zip= HH.Zip
       AND GQ.[Last Name]= HH.[Last Name]
       AND GQ.[First Name]= HH.[First Name]
      GROUP BY HH.[Household id]
             , HH.[Annualized Premium Amount]
             , GQ.[Referal SRC Id]) Z
WHERE Z.GQ_Source_ID LIKE 'ps%'
ORDER BY Z.GQ_Source_ID
       , Z.HH_Annualized_Premium ASC;

Access使用括号指定名称中带有特殊字符的列。这种复杂性只是在命名时应该使用下划线而不是空格的一个原因

GROUPBY子句应用于union之前的每个查询。在使用COUNT(*)时,您也没有充分指定需要聚合的所有字段,因此我在语句中添加了其他字段

将其全部移动到FROM子句中的子查询将允许您在ORDERBY子句中使用别名

最后,您只能为union组中的第一条SELECT语句提供字段别名。在联合后尝试重新命名某个内容将导致错误。更正后的代码至少可以为您提供一个有效的查询

更新:好的,根据您的反馈,下面是我正在做的。首先,我清理了您的查询,并从您的联合查询中删除了
计数(*)
。然后,通过查找最大溢价,我仅从中选择了唯一字段。这将消除ps*类别中的重复项

最后,我使用了所有这些作为子表,我从中选择了保费的总和函数:

SELECT HH_HH_ID, SUM(HH_Annualized_Premium) AS HH_Premium, GQ_Source_ID
FROM
  (SELECT HH_HH_ID, MAX(HH_Annualized_Premium), GQ_Source_ID FROM
  (SELECT
      HH.[Household id] AS HH_HH_ID,
      HH.[Annualized Premium Amount] AS HH_Annualized_Premium,
      GQ.[Referal SRC Id] AS GQ_Source_ID
  FROM Households HH INNER JOIN GatewayQ GQ ON GQ.[Household Id] = HH.[Household id]
  UNION ALL
  SELECT 
      HH.[Household id], 
      HH.[Annualized Premium Amount],
      GQ.[Referal SRC Id]
  FROM Households HH INNER JOIN GatewayQ GQ ON GQ.[Email]= HH.[Email]
  UNION ALL
  SELECT 
      HH.[Household id],
      HH.[Annualized Premium Amount],
      "ps*"
  FROM Households HH INNER JOIN GatewayQ GQ ON 
      GQ.[Zip]= HH.[Zip] AND
      GQ.[Last Name]= HH.[Last Name] AND
      GQ.[First Name]= HH.[First Name]
  WHERE GQ_Source_ID LIKE 'ps%')
  GROUP BY HH_HH_ID, GQ_Source_ID) temp_table
GROUP BY HH_HH_ID, GQ_Source_ID
ORDER BY 
    GQ_Source_ID, HH_Annualized_Premium;

请注意,这里没有HHCount字段。我认为这不是你想要的。看看你的问题陈述,这个计数实际上是每种类型(g1、r1、y1、ps*等)的推荐数量的计数。这些计数实际上并不意味着记录集中特定于住户ID的任何内容,因此并不真正属于此查询。

Access使用括号指定名称中带有特殊字符的列。这种复杂性只是在命名时应该使用下划线而不是空格的一个原因

GROUPBY子句应用于union之前的每个查询。在使用COUNT(*)时,您也没有充分指定需要聚合的所有字段,因此我在语句中添加了其他字段

将其全部移动到FROM子句中的子查询将允许您在ORDERBY子句中使用别名

最后,您只能为union组中的第一条SELECT语句提供字段别名。在联合后尝试重新命名某个内容将导致错误。更正后的代码至少可以为您提供一个有效的查询

更新:好的,根据您的反馈,下面是我正在做的。首先,我清理了您的查询,并从您的联合查询中删除了
计数(*)
。然后,通过查找最大溢价,我仅从中选择了唯一字段。这将消除ps*类别中的重复项

最后,我使用了所有这些作为子表,我从中选择了保费的总和函数:

SELECT HH_HH_ID, SUM(HH_Annualized_Premium) AS HH_Premium, GQ_Source_ID
FROM
  (SELECT HH_HH_ID, MAX(HH_Annualized_Premium), GQ_Source_ID FROM
  (SELECT
      HH.[Household id] AS HH_HH_ID,
      HH.[Annualized Premium Amount] AS HH_Annualized_Premium,
      GQ.[Referal SRC Id] AS GQ_Source_ID
  FROM Households HH INNER JOIN GatewayQ GQ ON GQ.[Household Id] = HH.[Household id]
  UNION ALL
  SELECT 
      HH.[Household id], 
      HH.[Annualized Premium Amount],
      GQ.[Referal SRC Id]
  FROM Households HH INNER JOIN GatewayQ GQ ON GQ.[Email]= HH.[Email]
  UNION ALL
  SELECT 
      HH.[Household id],
      HH.[Annualized Premium Amount],
      "ps*"
  FROM Households HH INNER JOIN GatewayQ GQ ON 
      GQ.[Zip]= HH.[Zip] AND
      GQ.[Last Name]= HH.[Last Name] AND
      GQ.[First Name]= HH.[First Name]
  WHERE GQ_Source_ID LIKE 'ps%')
  GROUP BY HH_HH_ID, GQ_Source_ID) temp_table
GROUP BY HH_HH_ID, GQ_Source_ID
ORDER BY 
    GQ_Source_ID, HH_Annualized_Premium;
请注意,这里没有HHCount字段。我认为这不是你想要的。看看你的问题陈述,这个计数实际上是每种类型(g1、r1、y1、ps*等)的推荐数量的计数。这些统计数字实际上并不意味着这所房子的任何具体情况