SQL 初学者:来自同一个 table 的多个 where 子句

SQL Beginner : Multiple where clause from same table

我是 SQL 的新手,不确定如何完成以下操作。

我有一个仪表 ID 列表,其中分配了一年的目标数据和一年的预算数据,但是这些都保存在同一个 table 中,并带有标识符 (TargetType) 以区分目标 (0) & 预算 (1)

ID   TARGETTYPE   VALUE01   VALUE02 ...(etc up to VALUE12)
123  0            1001      1100
123  1            9000      9100
456  0            5000      5100
456  1            8000      8100      

期望的结果还包括来自其他几个 table 的信息,他们也想将其添加到

到目前为止我的查询可以带出一组数据:

PARAMETERS 
[Utility] Text;

SELECT 
Contacts.Group,
Contacts.Site,
Points.ID,
Points.Utility,
Points.MPAN1,
Target.Value_01 AS [Target JAN],
Target.Value_02 AS [Target FEB],
Target.Value_03 AS [Target MAR],
Target.Value_04 AS [Target APR],
Target.Value_05 AS [Target MAY],
Target.Value_06 AS [Target JUN],
Target.Value_07 AS [Target JUL],
Target.Value_08 AS [Target AUG],
Target.Value_09 AS [Target SEP],
Target.Value_10 AS [Target OCT],
Target.Value_11 AS [Target NOV],
Target.Value_12 AS [Target DEC]

FROM 
((Contacts INNER JOIN Points ON Contacts.[Id] = Points.[Contacts_Id]) 
                  INNER JOIN Contracts ON Points.[Id] = Contracts.[Point_Id]) 
                  INNER JOIN Target ON Points.Id = Target.DataSetId

WHERE 
Points.UtilityType =[Utility]

ORDER BY 
Contacts.ClientGroup;

期望的输出
(这些值将通过 TargetJan 到 TargetDec,然后从 BudgetJan 到 BudgetDec,但为简洁起见我没有显示):

Group Site     ID   Utility MPAN1    TargetJan TargetFeb etc... BudgetJan  BudgetFeb etc...      
ABC   London   123  Gas     123456    1,000     1,100           9,000      9,100
ABC   NewYork  456  Gas     ABC123    5,000     5,100           8,000      8,100 

如何添加相同的字段,但取决于 Target.TargetType 的值,我猜这是一个联合查询,但我不知道。

任何关于从哪里开始的指示都将不胜感激:)


更新 #1
谢谢您的帮助。我想我理解了查询,但是仍然有一些我无法弄清楚的奇怪行为。

已使用查询

SELECT 
Points.ID,

  SUM(CASE WHEN Target.TargetType = '0' THEN Target.Value_01 else 0 end) AS [TGT JAN],
  SUM(CASE WHEN Target.TargetType = '0' THEN Target.Value_02 else 0 end) AS [TGT FEB],

FROM 
((Contacts INNER JOIN Points ON Contacts.[Id] = Points.[Contacts_Id]) 
              INNER JOIN Contracts ON Points.[Id] = Contracts.[Point_Id] )
              INNER JOIN Target ON Points.Id = Target.DataSetId

GROUP BY
Points.ID

ORDER BY
Points.ID;


我的数据行只有一个 Target.Type,然后根据需要查询 returns:
原始数据

ID     TARGETTYPE   VALUE_01   VALUE_02 
10079  0            7642      5735

结果

ID    TGTJAN   TGTFEB
10079 7642    5735

但是...如果我有一个包含 2 个或更多 TargetType 的 ID,则值输出将乘以 6。

原始数据

ID     TARGETTYPE   VALUE_01   VALUE_02 
7423   0            58339     57441
7423   1            1663      1637

结果

ID    TGTJAN   TGTFEB
7423  350034   344646

我已经尝试并删除了联系人 table 的 INNER JOIN(尽管我需要该连接),然后一切都按预期工作了????那么为什么 Contacts JOIN 会导致此问题?

请让我摆脱痛苦,因为我无法弄清楚发生了什么!

使用 select 大小写语法怎么样?

select
...
sum(case when Target.TargetType = 'Target' then Target.Value_01 else 0 end) AS [Target JAN],
sum(case when Target.TargetType = 'Budget' then Target.Value_01 else 0 end) AS [Budget JAN],
...
group by
--all fields in the select list which are not aggregates

为了将来参考,我已经通过重写连接和更改数据保存方式解决了这个问题,所以我不需要参考合同 table,这是多余的,可能是我怪异的原因x乘6问题。

SELECT 
Points.ID,

  SUM(CASE WHEN Target.TargetType = '0' THEN Target.Value_01 else 0 end) AS [TGT kWh JAN],
  SUM(CASE WHEN Target.TargetType = '0' THEN Target.Value_02 else 0 end) AS [TGT kWh FEB],

  SUM(CASE WHEN Target.TargetType = '1' THEN Target.Value_01 else 0 end) AS [BUD kWh JAN],
  SUM(CASE WHEN Target.TargetType = '1' THEN Target.Value_02 else 0 end) AS [BUD kWh FEB]

FROM (Contacts INNER JOIN Points ON Contacts.Id = Points.Contacts_Id)  
                       INNER JOIN Target ON Points.Id = Target.DataSetId

GROUP BY
Points.ID

ORDER BY
Points.ID;