如何获取单独的行,如果分组,这些行将具有特定的总和

How to fetch individual rows, that would have specific sums if be grouped

我使用的数据库是 Firebird 2.5。

我只想 select 数据,如果我对列 money 求和,我会得到所有人的所有行,这些行对他们的 money > 0 求和,而且它应该包含如果该人存在 money = 0 的行。

示例:

select name, surname, country, money from person group by 1,2,3 having sum(money)>0

它给了我:

SQL Error [335544824] [42000]: Dynamic SQL Error; SQL error code = -104; Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause) [SQLState:42000, ISC error code:335544824]
  Dynamic SQL Error; SQL error code = -104; Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause) [SQLState:42000, ISC error code:335544824]
    Dynamic SQL Error
      SQL error code = -104
      Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)

但是如果我将 money 列添加到组中,它会起作用,但它不会 return 包含 money = 0:

的行
select name, surname, country, money from person group by 1,2,3,4 having sum(money)>0

这是一个错误:

    SELECT stag, COMMESSA, MODELLO, linea, DATA_PROD, finiti
        FROM JAVA_PRODUTTIVITA 
    GROUP BY stag, commessa, MODELLO, linea, DATA_PROD 
    HAVING sum(finiti)>0;

但如果我在组中添加 finiti:

    SELECT stag, COMMESSA, MODELLO, linea, DATA_PROD, finiti
        FROM JAVA_PRODUTTIVITA 
    GROUP BY stag, commessa, MODELLO, linea, DATA_PROD, finiti 
    HAVING sum(finiti)>0;

结果:

STAG |COMMESSA |MODELLO   |LINEA |DATA_PROD           |FINITI |
-----|---------|----------|------|--------------------|-------|
18S  |00254    |S3BS01W   |L1    |2018-01-12 00:00:00 |21     |
18S  |00254    |S3BS01W   |L1    |2018-01-15 00:00:00 |56     |
18S  |00254    |S3BS01W   |L1    |2018-01-16 00:00:00 |41     |
18S  |00254    |S3BS01W   |L2    |2018-01-18 00:00:00 |58     |
18S  |00254    |S3BS01W   |L2    |2018-01-19 00:00:00 |44     |
18S  |00254    |S3BS01W   |L2    |2018-01-24 00:00:00 |16     |
18S  |00255    |S3BS01X   |L1    |2018-01-09 00:00:00 |54     |
18S  |00255    |S3BS01X   |L1    |2018-01-10 00:00:00 |56     |
18S  |00255    |S3BS01X   |L1    |2018-01-11 00:00:00 |60     |
18S  |00255    |S3BS01X   |L1    |2018-01-12 00:00:00 |40     |
18S  |00255    |S3BS01X   |L1    |2018-01-17 00:00:00 |15     |
18S  |00255    |S3BS01X   |L2    |2018-01-10 00:00:00 |70     |
18S  |00255    |S3BS01X   |L2    |2018-01-11 00:00:00 |80     |
18S  |00255    |S3BS01X   |L2    |2018-01-12 00:00:00 |90     |
18S  |00255    |S3BS01X   |L2    |2018-01-15 00:00:00 |100    |
18S  |00255    |S3BS01X   |L2    |2018-01-16 00:00:00 |70     |
18S  |00255    |S3BS01X   |L2    |2018-01-17 00:00:00 |33     |
18S  |00255    |S3BS01X   |L2    |2018-01-18 00:00:00 |19     |
18S  |00255    |S3BS01X   |L2    |2018-01-19 00:00:00 |23     |
18S  |00255    |S3BS01X   |L2    |2018-01-23 00:00:00 |5      |
18S  |00306    |MPLR16W   |L1    |2018-02-07 00:00:00 |20     |
18S  |00306    |MPLR16W   |L1    |2018-02-08 00:00:00 |47     |
18S  |00306    |MPLR16W   |L1    |2018-02-09 00:00:00 |58     |
18S  |00306    |MPLR16W   |L1    |2018-02-12 00:00:00 |96     |
18S  |00306    |MPLR16W   |L1    |2018-02-13 00:00:00 |86     |
18S  |00306    |MPLR16W   |L1    |2018-02-14 00:00:00 |32     |
18S  |00307    |MPLR16W-  |L1    |2018-02-21 00:00:00 |112    |
18S  |00307    |MPLR16W-  |L1    |2018-02-22 00:00:00 |86     |
18S  |00307    |MPLR16W-  |L1    |2018-02-23 00:00:00 |118    |
18S  |00307    |MPLR16W-  |L1    |2018-02-26 00:00:00 |102    |
18S  |00308    |MPLR16X   |L1    |2018-02-27 00:00:00 |40     |

两行之间的某处应该是带有 finiti = 0 的记录,但它不是。

使用您的示例 SQL,以下 SQL 可能有效。

您没有指定键,所以我将您组中的所有字段用于内部联接。

WITH SUMMARY
AS (SELECT NAME,
           SURNAME,
           COUNTRY
    FROM PERSON
    GROUP BY 1,
        2,
        3
    HAVING SUM(MONEY) > 0)
SELECT PERSON.NAME,
       PERSON.SURNAME,
       PERSON.COUNTRY,
       PERSON.MONEY
FROM SUMMARY
INNER JOIN PERSON ON (PERSON.NAME = SUMMARY.NAME AND PERSON.SURNAME = SUMMARY.SURNAME AND PERSON.COUNTRY = SUMMARY.COUNTRY) ;