按特定列的总和排序SQL查询

时间:2014-06-18 17:18:04

标签: sql sql-server sql-server-2005

以下是我要查询的相当大的表(SQL Server 2005)的摘录:

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

我对如何将其与我现有的巨型查询和订单结合起来感到茫然,而不是在最后添加每个列到该组。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

答案 2 :(得分: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

答案 3 :(得分: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(我假设你需要)并给总和一个名字。然后将其用作外部查询的输入,不包括总计为零且首先按最高总和排序的那些。

(顺便说一句,这不是一个大问题。我写的最大的单一选择声明覆盖超过250行,花了20分钟运行,并做了商品贸易公司的日常P&amp; L。这是很大.. 。)