SQL查询作业挫折

时间:2014-01-13 18:46:39

标签: mysql sql subquery pivot-table

我必须重新创建这个excel表:

enter image description here

使用此表:

enter image description here

以下就是我现在所拥有的,但这显然让我看了4次。

SELECT WEDSTRIJDFORMULIER.*, INDELING.Klas,
  CONCAT(SUM(UITSLAG.PuntenA), ' - ', SUM(UITSLAG.PuntenB)) AS Uitslag,
  CONCAT(UITSLAG.ScoreA, ' - ', UITSLAG.ScoreB) AS 'Set 1',
  CONCAT(UITSLAG.ScoreA, ' - ', UITSLAG.ScoreB) AS 'Set 2',
  CONCAT(UITSLAG.ScoreA, ' - ', UITSLAG.ScoreB) AS 'Set 3',
  CONCAT(UITSLAG.ScoreA, ' - ', UITSLAG.ScoreB) AS 'Set 4'
FROM WEDSTRIJDFORMULIER, INDELING, UITSLAG
WHERE INDELING.Team = WEDSTRIJDFORMULIER.TeamA
  AND UITSLAG.WID = WEDSTRIJDFORMULIER.WID
GROUP BY UITSLAG.WID

如何使用子查询获得第1,2,3和4组的分数?我不允许使用加入。

2 个答案:

答案 0 :(得分:0)

除了关于JOINs vs WHERE子句ANSI查询的评论之外,我认为你所缺少的更重要的事实是“Uitslag”和“Sets”1-4不是5列,而是10 ...每个都有两个列分别为scoreA和scoreB

Uitslag有Excel列E + F,第1组有G + H,第2组有I + J等。事实上,有人用标题跨越两列的“标题”来掩盖答案。< / p>

SELECT 
      WEDSTRIJDFORMULIER.*, 
      INDELING.Klas,
      SUM(UITSLAG.PuntenA) as UitslagA,
      SUM(UITSLAG.PuntenB) as UitslagB,
      SUM( case when UITSLAG.Set = 1 then UITSLAG.ScoreA else 0 end ) as Set1A,
      SUM( case when UITSLAG.Set = 1 then UITSLAG.ScoreB else 0 end ) as Set1B,
      SUM( case when UITSLAG.Set = 2 then UITSLAG.ScoreA else 0 end ) as Set2A,
      SUM( case when UITSLAG.Set = 2 then UITSLAG.ScoreB else 0 end ) as Set2B,
      SUM( case when UITSLAG.Set = 3 then UITSLAG.ScoreA else 0 end ) as Set3A,
      SUM( case when UITSLAG.Set = 3 then UITSLAG.ScoreB else 0 end ) as Set3B,
      SUM( case when UITSLAG.Set = 4 then UITSLAG.ScoreA else 0 end ) as Set4A,
      SUM( case when UITSLAG.Set = 4 then UITSLAG.ScoreB else 0 end ) as Set4B
   FROM 
      WEDSTRIJDFORMULIER, 
      INDELING, 
      UITSLAG
   WHERE 
          INDELING.Team = WEDSTRIJDFORMULIER.TeamA
      AND UITSLAG.WID = WEDSTRIJDFORMULIER.WID
   GROUP BY 
      UITSLAG.WID

注意情况/何时在SUM()中,只有当它是相应的1-4的相应“SET”时才专门查找每个。如果没有适当的总和列结果,只需使用0,否则,得到分数。

答案 1 :(得分:0)

第1步 - 开始别名表。例如,UITSLAG A意味着您现在可以说A.Klas而不是UITSLAG.Klas。

第2步 - 正如@Dan Andrews和@KM指出的那样,你已经在使用连接了。拿出来。

第3步 - 编写子查询。我不会为你做一个,因为这是家庭作业。但是,让我引导你完成它。

要启动子查询,请打开括号,然后键入完整的select语句并关闭括号。 select语句中的子查询只能返回一个值...只有一个!

要使用没有连接的子查询,它需要是一个相关的子查询。所以,在我的主查询中,我引用了表A,其键是A.Key。

因此,要从表B中恢复与表A中的主键相关的外键,我需要在select语句中编写以下子查询:

Select A.varA
    , A.varB --your subquery will start next
    , (Select B.Key 
        From TableB as B
        Where A.Key = B.Key) --Notice I referenced TableA without mentioning it in my subquery. This is what makes it a correlated subquery.
From TableA as A;

通过这种方式,您可以在子查询中引用主查询中的表,从而使Joins成为不必要的!

现在,正如@Eggyal指出的那样,使用相关子查询几乎总是比使用连接慢。但是,有时你只能通过相关的子查询得到你想要的东西,所以要好好学习!!!