使用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*等)的推荐数量的计数。这些统计数字实际上并不意味着这所房子的任何具体情况