2014-06-18 108 views
0

这里的总和是我对查询的相当大的表(SQL Server 2005中)的摘录:订购SQL查询通过specefic列

id (primary key) | account | phone | employee | address 
------------------------------------------------------------------ 
1    | 123  | Y | Y  | N 
2    | 456  | N | N  | N 
3    | 789  | Y | Y  | Y 

我只需要返回至少有行一个Y在电话,员工或地址中(其中约有10人未在此处显示)。那么我需要根据他们在三者中任何一个中的Y的数量来排列这些结果。

我试图让“tagTotal”是这样的:

SELECT 
SUM(
    CASE WHEN [phone] = 'Y' THEN 1 ELSE 0 END 
    + CASE WHEN [employee] = 'Y' THEN 1 ELSE 0 END 
    + CASE WHEN [address] = 'Y' THEN 1 ELSE 0 END 
) 
    FROM table 
    GROUP BY id 

这将返回:

tagTotal 
--------------- 
2 
0 
3 

我就如何将它与我现有的巨头查询合并亏损和按顺序排列,最后不添加每列。

+0

由于您不需要在行之间进行求和,因此请进行内联求和。 – xQbert

回答

2

由于价值观的你后的总和是在同一行,你并不需要汇集起来的结果,从而消除了该组的需求..

SELECT 
CASE WHEN [phone] = 'Y' THEN 1 ELSE 0 END + 
CASE WHEN [employee] = 'Y' THEN 1 ELSE 0 END + 
CASE WHEN [address] = 'Y' THEN 1 ELSE 0 END as Total 
FROM table 
0

尝试选择的ID并按总和排序?

SELECT id, 
SUM(
    CASE WHEN [phone] = 'Y' THEN 1 ELSE 0 END 
    + CASE WHEN [employee] = 'Y' THEN 1 ELSE 0 END 
    + CASE WHEN [address] = 'Y' THEN 1 ELSE 0 END 
) as numsum 
    FROM table 
    ORDER BY numsum 
0

这应该工作:

select * 
from 
(
    SELECT 
     id, 
     SUM(
      CASE WHEN [phone] = 'Y' THEN 1 ELSE 0 END 
      + CASE WHEN [employee] = 'Y' THEN 1 ELSE 0 END 
      + CASE WHEN [address] = 'Y' THEN 1 ELSE 0 END 
     ) tagTotal 
    FROM table 
    GROUP BY id 
) x 
where x.tagTotal <> 0 
order by x.tagTotal desc 

内部查询基本上是你的,增加的ID(我假设你需要),并给之一个名称。然后将其用作外部查询的输入,排除那些总数为零并且首先以最高总和排序的数据。 (顺便说一下,这不是一个大的查询,我写的最大的单个select语句覆盖了250多行,花了20分钟的时间运行,并且做了一个商品交易公司的日常交易,这很大。 ..)

1

您可以将添加添加为列,然后对结果进行排序。至少对于问题中的示例数据来说,聚合似乎是不必要的。每id只有一行。

SELECT t.* 
FROM (SELECT t.*, 
      ((CASE WHEN [phone] = 'Y' THEN 1 ELSE 0 END) + 
       (CASE WHEN [employee] = 'Y' THEN 1 ELSE 0 END) + 
       (CASE WHEN [address] = 'Y' THEN 1 ELSE 0 END) 
      ) as NumYs 
     FROM table t 
    ) t 
WHERE NumYs > 0 
ORDER BY NumYs DESC;