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

SQL初学者:来自同一表的多个where子句,sql,sql-server,case-when,Sql,Sql Server,Case When,我对SQL非常陌生,不知道如何完成以下任务 我有一个仪表ID列表,其中分配了一年的目标数据和一年的预算数据,但是这些数据都保存在同一个表中,带有标识符TargetType,以区分Target0和Budget1 ID TARGETTYPE VALUE01 VALUE02 ...(etc up to VALUE12) 123 0 1001 1100 123 1 9000 9100 456 0 50

我对SQL非常陌生,不知道如何完成以下任务

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

ID   TARGETTYPE   VALUE01   VALUE02 ...(etc up to VALUE12)
123  0            1001      1100
123  1            9000      9100
456  0            5000      5100
456  1            8000      8100      
期望的结果还包括来自其他几个表的信息,这些表也希望添加这些信息

到目前为止,我的查询可以提供一组数据:

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,然后从BUCKTJAN传递到BUCKTDEC,但为了简洁起见,我没有显示:

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 谢谢你的帮助。我想我理解这个问题,但是仍然有一些奇怪的行为我无法理解

使用的查询

其中“我的数据行”只有一个目标。键入后,查询将根据需要返回: 原始数据

结果

ID    TGTJAN   TGTFEB
10079 7642    5735
ID    TGTJAN   TGTFEB
7423  350034   344646
然而。。。如果我有一个带有2个或更多TargetTypes的ID,那么输出值将乘以6。 原始数据

结果

ID    TGTJAN   TGTFEB
10079 7642    5735
ID    TGTJAN   TGTFEB
7423  350034   344646
我已经尝试并删除了联系人表的内部连接,尽管我需要该连接,然后一切都按预期工作????那么,为什么联系人加入导致了这个问题?
请把我从痛苦中解救出来,因为我不知道发生了什么事

使用选择大小写语法怎么样

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

使用select-case语法怎么样

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

为了将来的参考,我已经通过重写连接和更改数据保存方式解决了这个问题,因此我不需要引用Contracts表,它是冗余的,可能是导致我奇怪的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;

为了将来的参考,我已经通过重写连接和更改数据保存方式解决了这个问题,因此我不需要引用Contracts表,它是冗余的,可能是导致我奇怪的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;

您能编辑您的问题并添加一个您想要的结果的示例吗?请告诉我们您使用的DBMS SQL只是一种查询语言,而不是特定的DBMS产品。您的示例使用的是非标准语法,看起来像SQL Server/T-SQLI相信这是SQL Server,因为帮助文档中提到的Union会起作用,然后按组排序您可以编辑您的问题并添加所需结果的示例吗?请告诉我们您使用的数据库管理系统SQL只是一种查询语言,不是特定的DBMS产品。您的示例是使用非标准语法,看起来像SQL Server/T-SQLI相信它是SQL Server,因为帮助文档中提到的Union可以工作,然后按组排序谢谢,这肯定给了我一个起点!但是,1我在使用查询的SUM部分时出错2我为每个ID获得了重复的行,而不是每个IDER都有一行中的值。错误是列“Points.ID”在select列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。选择Points.ID、Contacts.Text_7、Contacts.Name、sumcase,当Target.TargetType='0'然后Target.Value_01否则0结束为[TGT kWh JAN],从联系人上的联系人内部连接点。[ID]=点。[Contacts_ID]点上的内部连接契约。[ID]=契约。[Point\u ID]Points.Id=Target.DataSetId ORDER BY Contacts.Text_7上的内部连接目标;按Points.ID、Contacts.Text_7、Contacts.Name分组;我已经在我的示例中告诉过您:您必须将select列表中的所有字段放入group by子句,这些字段不是聚合的。现在我看到您的错误:1:删除;从order by和group子句之间签名,正确的顺序是group by而不是order by谢谢,这肯定给了我一个起点!但是,1我在使用查询的SUM部分时出错2我为每个ID获得了重复的行,而不是每个IDER都有一行中的值。错误是列“Points.ID”在select列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。选择Points.ID、Contacts.Text_7、Contacts.Name、sumcase,当Target.TargetType='0'然后Target.Value_01否则0结束为[TGT kWh JAN],从联系人上的联系人内部连接点。[ID]=点。[Contacts_ID]点上的内部连接契约。[ID]=契约。[Point\u ID]Points.Id=Target.DataSetId ORDER BY Contacts.Text_7上的内部连接目标;按Points.ID、Contacts.Text_7、Contacts.Name分组;我已经在我的示例中告诉过您:您必须将select列表中的所有字段放入group by子句,这些字段不是聚合的。现在我看到您的错误:1:删除;在order by和group子句之间签名,并且正确的order是group by而不是order by