2014-01-22 98 views
0

我想按照下面的方式对我的工作站代码进行分组,但是我的结果集会不断输出所有内容,并且会多次输出others。我想通过我的别名将所有内容分组,但是对于我的工作站others,它似乎并不像是对它进行分组。按别名分组

WITH 
     station as (
     SELECT 
     CASE 
      WHEN t.station='AB' THEN 'AB' 
      WHEN t.station='AS' THEN 'AS' 
      WHEN t.station='KF' THEN 'KF' 
      WHEN t.station='PR' THEN 'PR' 
      WHEN t.station='SV' THEN 'SV' 
      WHEN t.station='RE' THEN 'RE' 
      WHEN t.station='TVR' OR t.station='TDT' THEN 'TDT' 
      ELSE 'Others' 
     END AS 'station' 
     FROM t 

    ) 
     porders as (
     SELECT 
     CASE 
      WHEN t.station='AB' THEN 'AB' 
      WHEN t.station='AS' THEN 'AS' 
      WHEN t.station='KF' THEN 'KF' 
      WHEN t.station='PR' THEN 'PR' 
      WHEN t.station='SV' THEN 'SV' 
      WHEN t.station='RE' THEN 'RE' 
      WHEN t.station='TVR' OR t.station='TDT' THEN 'TDT' 
      ELSE 'Others' 
     END AS 'station', 
     COUNT(*) AS 'p_orders' 
     FROM a, t, v, station 
     WHERE a.psn = t.psn 
      AND t.highest_psn = 0 
      AND v.detailno_i = a.detailno_i 
      AND t.station!='' 
      AND a.status=1 
      AND v.order_type='P' 
      GROUP BY t.station 

) 
     SELECT station.station, porders.p_orders 
     FROM station join porders on(station.station=porders.station) 

输出

station|porders 
--------------- 
AB  2 
AS  4 
KF  3 
PR  10 
SV  2 
RE  20 
TDT  10 
Others 1 
Others 2 
Others 3 

所需的输出:

station|porders 
--------------- 
AB  2 
AS  4 
KF  3 
PR  10 
SV  2 
RE  20 
TDT  10 
Others 6 
+2

等一下,您使用的是什么RDBMS?,您的第二个CTE如何不使用“GROUP BY”而使用聚合函数? – Lamak

+0

对不起,只是做了一个编辑它我忘了复制该部分..我正在使用Microsoft SQL Server – ltsai

回答

2

您得到的结果是因为您有三个t.station值映射到Other这一事实GROUP BY t.station并不关心他们在您的选择中预计到Other

为了解决这个问题,你用你的情况,而不是翻译值t.station

GROUP BY 
     CASE 
      WHEN t.station='AB' THEN 'AB' 
      WHEN t.station='AS' THEN 'AS' 
      WHEN t.station='KF' THEN 'KF' 
      WHEN t.station='PR' THEN 'PR' 
      WHEN t.station='SV' THEN 'SV' 
      WHEN t.station='RE' THEN 'RE' 
      WHEN t.station='TVR' OR t.station='TDT' THEN 'TDT' 
      ELSE 'Others' 
     END 
+0

哇不知道我可以做到这一点..非常感谢你! – ltsai

0

为了您的最后两行,怎么样:

SELECT station.station, SUM(porders.p_orders) as tot_porders 
FROM station join porders on(station.station=porders.station) 
GROUP BY station.station 
2

需要组这不是一个答案,只是一个注释,您可以简化您的情况陈述了很多:

CASE WHEN t.station in ('AB', 'AS', 'KF', 'PR', 'SV', 'RE') THEN t.station 
     WHEN t.station in ('TVR', 'TDT') THEN 'TDT' 
     ELSE 'Others' 
    END 
+0

谢谢你的提示!我发现这非常有用:) – ltsai