1

我正在学校工作一个学期。我不太习惯使用 SQL,我正在努力掌握它....

我的主管给了我一个用户任务,我需要在其中获取行数据并制作列。我们使用交叉表向导并自动创建 SQL 来获得我们需要的东西。

基本上,我们有一个这样的表:

ReqNumber       Year       FilledFlag(is a checkbox)      FilledBy

    1          2012               (notchecked)            ITSchoolBoy
    1          2012               (checked)               GradStudent
    1          2012               (notchecked)            HighSchooler
    2        etc, etc.

用户想要的是列出所有请求编号以及检查的内容

我们的自动透视代码为我们提供了所有 FilledBy 选项(总共有 9 个)作为列标题,并按 reqnumber 对其进行分组。

如果没有枢轴,你怎么能做到这一点?我想解决这个问题。我能找到的最近的是:

SELECT
   SUM(IIF(FilledBy = 'ITSchoolboy',1,0) as ITSchoolboy,
   SUM(IIF(FilledBy = 'GradStudent',1,0) as GradStudent, etc.
FROM myTable

有人可以帮我解释一下吗?给我指个向导的方向?我一直在寻找一天中最好的部分,即使我是学生,我认为这不会被笑太久。但我真的很想知道!

4

1 回答 1

1

如果您按 ReqNumber 分组,我认为您老板的建议可能会奏效。

SELECT
   ReqNumber,
   SUM(IIF(FilledBy = 'ITSchoolboy',1,0) as ITSchoolboy,
   SUM(IIF(FilledBy = 'GradStudent',1,0) as GradStudent,
   etc.
FROM myTable
GROUP BY ReqNumber;

另一种方法是加入多个子查询。此示例引入了您的 2 个类别。如果您需要将其扩展到 9 个类别,那么您将有大量的加入。

SELECT
    itsb.ReqNumber,
    itsb.ITSchoolboy,
    grad.GradStudent
FROM
    (
        SELECT
           ReqNumber,
           FilledFlag AS ITSchoolboy
        FROM myTable
        WHERE FilledBy = "ITSchoolboy"
    ) AS itsb
    INNER JOIN
    (
        SELECT
           ReqNumber,
           FilledFlag AS GradStudent
        FROM myTable
        WHERE FilledBy = "GradStudent"
    ) AS grad
    ON itsb.ReqNumber = grad.ReqNumber

请注意,我并不是建议您使用这种方法。但是,既然您询问了枢轴方法的替代方案(有效)......这是一个。请继续关注,以防其他人提供更简单的替代方案。:-)

于 2012-04-11T15:33:43.870 回答