2010-09-09 125 views
1

我有這樣值的表,GROUP BY子句查詢

我想按cusotmer名稱,其中作爲本地金額總和不得超過50000別的我需要刪除那些不符合的記錄?

如何在sql server 2005中實現它?

TRN 259 3 9/9/2010 6622 68667(Rs) ABHIJIT KATARE 
TRN 260 3 9/9/2010 6622 14635(Rs) ABHIJIT KATARE 
TRN 235 3 9/9/2010 6586 68128 AJAY PARASRAMPURIA 
TRN 236 3 9/9/2010 6586 14490 AJAY PARASRAMPURIA 
TRN 257 3 9/9/2010 6621 68667 ANAND DESAI 
TRN 258 3 9/9/2010 6621 14635 ANAND DESAI 
TRN 287 3 9/9/2010 6817 119095 ANAND KATAKAM 
TRN 242 3 9/9/2010 6594 95689 ANILKUMAR MUTHUNPARA 
TRN 211 3 9/9/2010 6507 52239 ARBIND KUMAR GUPTA 
TRN 212 3 9/9/2010 6538 63183 ASHOK KELKAR 
TRN 185 3 9/9/2010 6431 140610 BANSAL Y.K 
TRN 186 3 9/9/2010 6431 46845 BANSAL Y.K 
TRN 248 3 9/9/2010 6600 72565 BENNO HANS LUKE 

回答

0

這將顯示有小於50000的客戶:

select CustomerName, sum(LocalAmount) 
from MyTable 
group by CustomerName 
having sum(LocalAmount) <= 50000 

請注意,您可以通過CustomerID是更好的分組,如果有一個,因爲有可能是重名。然後,你可以這樣做:刪除:

delete from MyTable 
where CustomerID in (
    select CustomerID 
    from MyTable 
    group by CustomerID 
    having sum(LocalAmount) <= 50000 
) 
+0

你怎麼知道有一個CustomerID列?即使有一個,它也可能有多個具有相同顯示名稱的ID。我曾在一個客戶購買另一個客戶的系統中看到過這種情況,他們更改了顯示名稱,但FK仍然使用原始ID – 2010-09-09 14:23:41

+0

我不知道這是假設 - 這就是爲什麼第一個示例使用客戶名稱的原因。 – RedFilter 2010-09-09 14:25:14

0

嘗試本作的選擇:

SELECT * FROM Table 
GROUP BY CustomerName 
HAVING SUM(LocalAmount) > 50000 

嘗試此刪除(修改@ RedFilter的版本):

delete from MyTable 
where CustomerName in (
    select CustomerName 
    from Table 
    group by CustomerName 
    having sum(LocalAmount) <= 50000 
) 
0

select * from MyTable group by CustomerName having sum(LocalAmount) > 50000

0

看到好排使用:

SELECT 
    cusotmerName ,SUM(localAmount) 
    FROM YourTable 
    GROUP BY cusotmerName 
    HAVING SUM(localAmount)>50000 

刪除有問題的行使用:

DELETE YourTable 
WHERE 
    CustomerName IN (SELECT 
          cusotmerName 
          FROM YourTable 
          GROUP BY cusotmerName 
          HAVING SUM(localAmount)<50000 
         ) 
0

這句法看起來有點怪異,但它的工程!

;with cte as 
(
select sum(LocalAmount) over (partition by cname) s 
from yourtable 
) 
delete from cte where s <= 50000