2014-06-18 75 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;