【发布时间】:2012-12-28 19:59:16
【问题描述】:
我有一个表,我需要使用它来构建一个结果集,其中表中的某些行是结果集中的列。我开始将LEFT JOINs 多次链接在桌子上,但我需要消除与集合中已有的另一个结果的不同组合的结果:
例如,如果我得到 1、21、25 作为结果列,我不能在结果中包含这些数字的任何其他组合。
我的表定义是:
Table tblKPIDetails
Column Month int
Column Year int
Column Division varchar(3)
Column KPI int
Column Value decimal(18,4)
我目前的查询是:
SELECT *
FROM tblKPIDetails J1
LEFT JOIN tblKPIDetails J2 ON J2.Month = J1.Month AND J2.Year = J1.Year AND J2.Division = J1.Division AND NOT(J2.KPI = J1.KPI ) AND (J2.KPI = 1 OR J2.KPI = 21 OR J2.KPI = 25)
LEFT JOIN tblKPIDetails J3 ON J3.Month = J1.Month AND J3.Year = J1.Year AND J3.Division = J1.Division AND NOT(J3.KPI = J1.KPI ) AND (J3.KPI = 1 OR J3.KPI = 21 OR J3.KPI = 25)
WHERE J1.KPI = 1 OR J1.KPI = 21 OR J1.KPI = 25
我知道这是错误的,但这是我需要的超集。在上述查询的结果中,我可以获得 J1.KPI、J2.KPI、J3.KPI 或 J1.KPI、J3.KPI、J2.KPI 或任何其他组合。
我的预期结果是:
Division | Month | Year | KPIA | KPIAValue | KPIB | KPIBValue | KPIC | KPICValue
对于每个部门、月份和年份
其中 KPIA、KPIB 或 KPIC = 1、21 或 25,但每个部门仅存在 1、21、25 的 1 个组合|月|年
编辑
为了更清楚地说明预期结果,使用上述查询,我得到以下结果:
Division | Month | Year | KPIA | KPIAValue | KPIB | KPIBValue | KPIC | KPICValue
--------------------------------------------------------------------------------
000 1 2012 1 1000 21 2000 25 3000
000 1 2012 21 2000 1 1000 25 3000
000 1 2012 25 3000 21 2000 1 1000
111 1 2012 1 555 21 10000 25 5000
我需要这样做,这样我的结果就只能是前 3 个结果中的任何一个,然后是最后一个......例如:
Division | Month | Year | KPIA | KPIAValue | KPIB | KPIBValue | KPIC | KPICValue
--------------------------------------------------------------------------------
000 1 2012 25 3000 21 2000 1 1000
111 1 2012 1 555 21 10000 25 5000
【问题讨论】:
-
请向我们展示您的预期结果。
-
@bonCodigo 我添加了我的预期输出。
-
WHERE J1.KPI = 1 OR J1.KPI = 21 OR J1.KPI = 25可以替换为J1.KPI IN (1, 21, 25)。无论如何,您的观点发生了什么变化? -
为简洁起见,我删除了该视图...它与手头的问题无关。糟糕,刚刚意识到我忘了从第一个 JOIN 中删除“ON”。
标签: sql sql-server join left-join