在不使用PIVOT的情况下将行数据转换为Access 07

时间:2012-04-11 14:21:45

标签: sql ms-access ms-access-2007

我从学校开始工作。我不习惯使用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个)作为列标题,并按要求对它们进行分组。

如果没有支点,你怎么能这样做?我想绕过这个问题。我能找到的最近的东西是:

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

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

1 个答案:

答案 0 :(得分:1)

如果你是GROUP BY 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

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