2017-08-29 83 views
1

是否可以删除总和为0的行?SQL - 是否可以查找具有相同Group By的等于0的总和?

这里是表:

+-----------+--------------+ 
| Subledger | ActualAmount | 
+-----------+--------------+ 
| WWE12  | -25775  | 
| WWE12  | -217   | 
| WWE12  | -43   | 
| WWE12  | 260   | 
| WWE12  | 48994  | 
+-----------+--------------+ 

和期望的结果应该是:

+-----------+--------------+ 
| Subledger | ActualAmount | 
+-----------+--------------+ 
| WWE12  | -217   | 
| WWE12  | -43   | 
| WWE12  | 260   | 
+-----------+--------------+ 

任何帮助是极大的赞赏。

非常感谢!

+2

从结果集中移除这五行中的两行的逻辑尚不清楚。这些行如何与0 *的总和相关?请[编辑]你的问题。 –

+0

那么,如果你在期望的结果中总结那3个答案将是0.这就是我想看到的不是-25775和48994 – Jomari

+0

你已经失去了我! – Strawberry

回答

0

这是很做作,因为我事先知道该款项是由3个值的,但无论如何...

SELECT x.* 
    FROM 
    (SELECT DISTINCT GROUP_CONCAT(DISTINCT c.actualamount ORDER BY c.actualamount) members 
      , SUM(DISTINCT c.actualamount) total 
     FROM my_table a 
     JOIN my_table b 
      ON b.actualamount NOT IN (a.actualamount) 
     JOIN my_table c 
      ON c.actualamount NOT IN (a.actualamount,b.actualamount) 
     GROUP 
      BY a.actualamount 
      , b.actualamount 
     HAVING total = 0 
    ) n 
    JOIN my_table x 
    ON FIND_IN_SET(actualamount,members) > 0; 
0

请试试这个:

SELECT ROW_NUMBER() OVER (ORDER BY ActualAmount DESC) rw , 
     * 
INTO #Negative 
FROM your_table 
WHERE ActualAmount < 0; 

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1 
            )) rw , 
     * 
INTO #Positive 
FROM your_table 
WHERE ActualAmount > 0; 


CREATE TABLE #FinalTable 
    (
     Subledger NVARCHAR(50) NULL , 
     ActualAmount INT NULL 
    ); 

DECLARE @NCounterMax INT= (SELECT COUNT(*) 
          FROM #Negative 
         ); 
DECLARE @PCounterMax INT= (SELECT COUNT(*) 
          FROM #Positive 
         ) , 
    @NC INT= 1 , 
    @PC INT= 1 , 
    @amount INT= 0 , 
    @amount2 INT= 0 , 
    @subledger NVARCHAR(50) , 
    @countinue BIT = 1 , 
    @SumAmount INT= 0; 
WHILE (@PC <= @PCounterMax) 
    BEGIN 
     SELECT @amount = ActualAmount , 
       @subledger = Subledger 
     FROM #Positive 
     WHERE rw = @PC; 
     INSERT INTO #FinalTable 
     VALUES (@subledger, @amount); 
     SET @SumAmount = @amount; 
     PRINT @amount; 
     WHILE (@NC <= @NCounterMax) 
      BEGIN 
       SELECT @amount2 = ActualAmount , 
         @subledger = Subledger 
       FROM #Negative 
       WHERE rw = @NC; 
       INSERT INTO #FinalTable 
       VALUES (@subledger, @amount2); 
       SET @SumAmount = @SumAmount + @amount2; 
       IF (@SumAmount = 0) 
        BEGIN 
         SET @countinue = 0; 
         BREAK; 
        END; 
       SET @NC = @NC + 1; 
      END; 
     IF (@countinue = 0) 
      BREAK; 
     DELETE #FinalTable; 
     SET @PC = @PC + 1; 
    END; 
SELECT * 
FROM #FinalTable; 

DROP TABLE #Negative; 
DROP TABLE #Positive; 
DROP TABLE #FinalTable; 

可以删除#FinalTable记录从你的表中。