如何获取单独的行,如果分组,这些行将具有特定的总和
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) ;
我使用的数据库是 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) ;