SQL查询列的多个值作为多个列(SQL 2005)

时间:2010-11-25 15:58:31

标签: sql-server

当我在一个表上运行SQL查询时,这里是数据(这只是一个示例,错误列可能超过10个)

time   total  Error  

00:16    6    10000(E)

00:20    4    10000(E)

00:46    2    10000(E)

01:01    2    10000(E)

01:40    2    10000(E)

02:07    2    10000(E)

02:52    1    10000(E)

04:27    2    10000(E)

04:29    6    10000(E)

04:32    4    10000(E)

04:49    2    10000(E)

04:50    2    10000(E)

06:18    2    10000(E)

09:04    1    10000(E)

10:57    4    10000(E)

10:58    4    10000(E)

00:36    1    9401(E)

00:37    1    9401(E)

00:57    1    9401(E)

00:58    1    9401(E)

01:32    1    9401(E)

01:33    1    9401(E)

02:36    2    9401(E)

03:05    1    9401(E)

03:06    1    9401(E)

09:53    2    9401(E)

12:11    2    9401(E)

12:12    4    9401(E)

12:41    1    9401(E)

我想写一个SQL查询,以便我想得到像这样的上述数据

time    10000(E)    9401(E)
---------------------------

00:16    6            0

00:20    4            0

00:36    0            1

00:37    0            1

00:46    2            0

00:57    0            1

00:58    0            1

01:01    2            0

01:32    0            1

01:33    0            1

01:40    2            0

02:07    2            0

02:36    0            2

02:52    1            0

03:05    0            1

03:06    0            1

04:27    2            0

04:29    6            0

04:32    4            0

04:49    2            0

04:50    2            0

06:18    2            0

09:04    1            0

09:53    0            1

10:57    4            0

10:58    4            0

12:11    0            2

12:12    0            4

12:41    0            1

这可能吗?

2 个答案:

答案 0 :(得分:0)

这是否符合您的要求?

select e.time
        , e.[10000(E)]
        , e.[9401(E)]
    from (
        select time
                , SUM(case when Error LIKE N'10000(E)' then Total else NULL end) as [10000(E)]
                , null as [9401(E)]
            from MyTable
            where Error LIKE N'10000(E)'
            group by time
        union
        select time
                , null as [10000(E)]
                , SUM(case when Error LIKE N'9401' then Total else NULL end) as [9401(E)]
            from MyTable
            where Error LIKE N'9401(E)'
            group by time
    ) e
order by e.time

如果不是,请告诉我结果,以便我可以进行正确的更正。

SUM函数只能将同一错误的出现次数分组到给定的time,这实际上就是你在表中所拥有的。因此,它不应该修改任何数据。另一方面,如果同时有两个相同错误的不同记录,那么它们应按此time分组,并且将添加此错误的总数。

答案 1 :(得分:0)

对于您给定的输入和输出,它可能就像这样简单。

SELECT  *
FROM    (
          SELECT time
                 , [10000(E)] = Total
                 , [9401(E)] = 0
          FROM   YourTable
          WHERE  Error = '10000(E)'
          UNION ALL
          SELECT time
                 , [10000(E)] = 0
                 , [9401(E)] = Total
          FROM   YourTable
          WHERE  Error = '9401(E)'
        ) q
ORDER BY
        time