2015-12-16 81 views
-1

我想通过不同站点上的车辆注册牌进行分组,车辆进入站点的次数是多少次,我正在使用SQL Server 2008 R2。按SQL Server中3列的范围组

我的数据是这样的:

Streetname vrm 0-9 10-19 19-20 
Ebbw vale xyz  1  15  30 
Peel Center M89GW 6  35  45 

这是我的查询:

Select 
    t.t_street_name, COUNT(t_vrm) as MultipleEntries 
from 
    (select 
     case 
      when count(t_vrm) between 0 and 9 then '0-9' 
      when count(t_vrm) between 10 and 19 then '10-19' 
      when count(t_vrm) between 20 and 29 then '20-29' 
      when count(t_vrm) between 30 and 39 then '30-39' 
      when count(t_vrm) between 40 and 49 then '40-49' 
      when count(t_vrm) between 50 and 59 then '50-59' 
     end as t_vrm 
    from 
     [ICPS].[dbo].[tickets]) t 
where 
    convert (datetime, t.t_date_time_issued, 101) between convert(datetime, '2015/11/15', 101) and convert (datetime, '2015/12/17', 101) 
Group By 
    t_vrm, t.t_street_name 

我得到这个错误

无效的列名t_street_name

+0

,你能否告诉了' [ICPS]。[dbo]。[门票]'结构? –

+0

你的查询是搞砸了。你在没有'group by'的子查询中有count()'。然后你在外部查询中有'group by'。所以,有很多问题。你想做什么? –

回答

1

我看到您的问题,您创建了一个子查询作为表,并且您正在尝试获取未在子查询中选中的列。您需要添加该列t_street_name以便外部选择看到它。

所以试试这种方式。在此猜测,缺少的列是来自[ICPS].[dbo].[tickets]表。所以

Select t.t_street_name,COUNT(t_vrm) as MultipleEntries 
    from (select case 
       when count(t_vrm) between 0 and 9 then '0-9' 
       when count(t_vrm) between 10 and 19 then '10-19' 
       when count(t_vrm) between 20 and 29 then '20-29' 
       when count(t_vrm) between 30 and 39 then '30-39' 
       when count(t_vrm) between 40 and 49 then '40-49' 
       when count(t_vrm) between 50 and 59 then '50-59' 
       end as t_vrm, 
       t_street_name -- HERE YOU FORGOT HERE 
      from 
       [ICPS].[dbo].[tickets] 
      group by t_street_name 
     )t     
     where convert (datetime,t.t_date_time_issued,101) 
        between convert(datetime,'2015/11/15',101) 
         and convert (datetime,'2015/12/17',101) 
    Group By t_vrm, t.t_street_name 

当你使用它成为你的表,因此对外部查询列是只有你的子查询选择的,对你的情况只是t_vrm

按照该@GordonLinoff一个子查询发表评论我已经来看看你的查询,看看那是你真正想要的是所谓的枢转表这是把行转换成列,所以你的问题正确的查询是:

Select t.*, 
    from (select t_street_name, 
       case when count(t_vrm) between 0 and 9 then '0-9' end as "0-9", 
       case when count(t_vrm) between 10 and 19 then '10-19' end as "10-19", 
       case when count(t_vrm) between 20 and 29 then '20-29' end as "20-29", 
       case when count(t_vrm) between 30 and 39 then '30-39' end as "30-39", 
       case when count(t_vrm) between 40 and 49 then '40-49' end as "40-49", 
       case when count(t_vrm) between 50 and 59 then '50-59' end as "50-59" 
      from [ICPS].[dbo].[tickets] 
     where convert (datetime,t.t_date_time_issued,101) 
        between convert(datetime,'2015/11/15',101) 
         and convert (datetime,'2015/12/17',101) 
     group by t_street_name 
     )t