Sql 如果另一个字段等于某个特定值,则连接字段

Sql 如果另一个字段等于某个特定值,则连接字段,sql,ms-access,join,Sql,Ms Access,Join,我正在尝试将一个表中的多个字段连接到另一个表中的字段。它们将通过另一个字段中的值进行区分。我不确定这个加入应该如何运作,并将感谢您的建议。下面是这些表格的示例 Bldg|EMeter|GMeter|HMeter|CMeter Bld1_1______1______1______1_____ Bld2_2______3______328____2_____ Bld2_NULL___4______NULL___NULL Utility|Meter|TotCost| E_______5_____2

我正在尝试将一个表中的多个字段连接到另一个表中的字段。它们将通过另一个字段中的值进行区分。我不确定这个加入应该如何运作,并将感谢您的建议。下面是这些表格的示例

Bldg|EMeter|GMeter|HMeter|CMeter
Bld1_1______1______1______1_____
Bld2_2______3______328____2_____
Bld2_NULL___4______NULL___NULL


Utility|Meter|TotCost|
E_______5_____20______
C_______5_____80______
H_______5_____123______
G_______5_____654______
E_______6_____999______
E_______7_____205______
G_______6_____200______
G_______7_____40______
这些表格显然只是我正在处理的问题的代表。但我试图编写一个查询,将第一个表中的所有仪表列与第二个表中的仪表列进行匹配,但只有当实用程序值与仪表中的第一个字母匹配时(EMeter与E、GMeter与G等匹配),建筑也可以有一个以上的记录,因为它们可以有一种类型的多个仪表。我试图得到每栋建筑的成本,每种类型的仪表,所以我将每栋建筑的所有独立仪表加在一起(例如,bldg2如何将G的两个仪表加在一起,每个仪表都有需要加在一起的总成本。我试图在我的查询中按建筑分组,将所有仪表加在一起)。我试图使用select查询将第一个查询中的米与第二个查询中实用程序匹配的米连接起来,但我根本无法获得如何实现这一点的语法或设计。最后,我希望有一个select by查询显示如下内容

Bldg|ECost|GCost|HCost|CCost
Bld1_2000__39483_20____3829_
Bld2_2034__385___2839__3010_

由于第一个表中列的名称是固定的,因此您可以构建一个使用外部联接的查询,然后使用
SUM()
进行分组,如下所示:

SELECT
    m.Bldg
,   SUM(e.TotCost) AS ECost
,   SUM(g.TotCost) AS GCost
,   SUM(h.TotCost) AS HCost
,   SUM(c.TotCost) AS CCost
FROM tblBldgMeters  m
LEFT OUTER JOIN qryMtrHistory e ON e.Utility='E' AND m.EMeter=e.Meter
LEFT OUTER JOIN qryMtrHistory g ON g.Utility='G' AND m.GMeter=g.Meter
LEFT OUTER JOIN qryMtrHistory h ON h.Utility='H' AND m.HMeter=h.Meter
LEFT OUTER JOIN qryMtrHistory c ON c.Utility='C' AND m.CMeter=c.Meter
GROUP BY m.Bldg
它表示不支持联接表达式

这是MS Access SQL引擎的一个问题。您可以将其重写为其他查询:

SELECT
    m.Bldg
,   SUM(e.TotCost * SWITCH(e.Utility='E', 1, true, 0)) AS ECost
,   SUM(g.TotCost * SWITCH(g.Utility='G', 1, true, 0)) AS GCost
,   SUM(h.TotCost * SWITCH(h.Utility='H', 1, true, 0)) AS HCost
,   SUM(c.TotCost * SWITCH(c.Utility='C', 1, true, 0)) AS CCost
FROM tblBldgMeters  m
LEFT OUTER JOIN qryMtrHistory e ON AND m.EMeter=e.Meter
LEFT OUTER JOIN qryMtrHistory g ON AND m.GMeter=g.Meter
LEFT OUTER JOIN qryMtrHistory h ON AND m.HMeter=h.Meter
LEFT OUTER JOIN qryMtrHistory c ON AND m.CMeter=c.Meter
GROUP BY m.Bldg

这将把条件从
JOIN
移动到
SWITCH

您是如何获得Bld1的2000 ECost的?这只是虚拟数据,只是具有代表性。对不起,我对您的查询有点困惑。第一个表称为tblBldgMeters,第二个表称为qryMtrHistory。什么是建筑仪表m?什么是TotCost,g.TotCost,h.TotCost等。?在那个上下文中,g和h是什么?我编辑了以使用您的表名
m
e
g
h
c
是在查询中分配的表别名。例如,
g
有一行
qryMtrHistory
其中
实用程序
g
。哇,这真是太酷了!非常感谢你!另一个问题是,这个总数是用电表的数量乘以总成本吗?每个米数对应一个单独的成本,所以我需要为每个建筑添加所有不同的成本。或者这是在做一些不同的事情?@hypetech查询忽略了仪表号。它假设
tblBldgMeters.XMeter
是米数,应该乘以相应的
总成本。在您的示例中,
Bld2
ECost
将包含
2*20+2*999+2*205
<代码>2
来自
EMeter
用于
Bld2
,数字
20
999
205
来自
qryMtrHistory
的三行,其中
实用程序设置为
'E'
。哦,对不起@dablinkenlight我不清楚。每栋建筑都可以有几米,但这些米都是独一无二的。这些数字只代表特定的仪表。与Bldg2类似,Bldg2将煤气表3和煤气表4连接在一起。我需要将
tblBldgMeters
中的仪表编号与
qryMeterHistory