sql-server - 为什么此 SQL Server 查询不返回预期结果?
问题描述
我有这张表,用于描述交易:
noconta |numerario|dataefectivacao |datarealizacao |tipomov|descricao |
-----------|---------|-------------------|-------------------|-------|----------------------------------------------------|
11111111111| 58|2018-10-26 00:00:00|2018-10-24 00:00:00| 0|Movimento Genérico 6-1 (Não Dezembro 2018) (Crédito)|
11111111111| 11|2018-12-27 00:00:00|2018-10-25 00:00:00| 1|Movimento Genérico 7-1 (Não Dezembro 2018) (Débito) |
11111111111| 24|2018-12-14 00:00:00|2018-12-12 00:00:00| 0|Movimento Genérico 1-1 (Crédito) |
11111111111| 42|2018-12-16 00:00:00|2018-12-13 00:00:00| 0|Movimento Genérico 2-1 (Crédito) |
11111111111| 44|2018-12-17 00:00:00|2018-12-14 00:00:00| 1|Movimento Genérico 4-1 (Débito) |
11111111111| 31|2018-12-15 00:00:00|2018-12-18 00:00:00| 1|Movimento Genérico 5-1 (Débito) |
11111111111| 55|2018-12-22 00:00:00|2018-12-19 00:00:00| 0|Movimento Genérico 3-1 (Crédito) |
22222222222| 45|2018-10-24 00:00:00|2018-10-22 00:00:00| 0|Movimento Genérico 6-2 (Não Dezembro 2018) (Crédito)|
22222222222| 241|2018-12-12 00:00:00|2018-12-10 00:00:00| 0|Movimento Genérico 1-2 (Crédito) |
22222222222| 12|2018-12-14 00:00:00|2018-12-11 00:00:00| 0|Movimento Genérico 2-2 (Crédito) |
22222222222| 35|2018-12-15 00:00:00|2018-12-12 00:00:00| 1|Movimento Genérico 4-2 (Débito) |
22222222222| 22|2018-12-16 00:00:00|2018-12-13 00:00:00| 1|Movimento Genérico 5-2 (Débito) |
22222222222| 31|2018-12-20 00:00:00|2018-12-17 00:00:00| 0|Movimento Genérico 3-2 (Crédito) |
22222222222| 23|2018-10-25 00:00:00|2018-12-23 00:00:00| 1|Movimento Genérico 7-2 (Não Dezembro 2018) (Débito) |
33333333333| 51|2018-10-22 00:00:00|2018-10-20 00:00:00| 0|Movimento Genérico 6-3 (Não Dezembro 2018) (Crédito)|
33333333333| 241|2018-12-09 00:00:00|2018-12-07 00:00:00| 0|Movimento Genérico 1-3 (Crédito) |
33333333333| 15|2018-12-13 00:00:00|2018-12-10 00:00:00| 1|Movimento Genérico 4-3 (Débito) |
33333333333| 41|2018-12-14 00:00:00|2018-12-11 00:00:00| 1|Movimento Genérico 5-3 (Débito) |
33333333333| 92|2018-10-23 00:00:00|2018-12-21 00:00:00| 1|Movimento Genérico 7-3 (Não Dezembro 2018) (Débito) |
在 2018 年 12 月期间,如何编写一个查询,该查询旨在返回账户编号(“noconta”),对于该账户,贷方 ( ) 的数字总和 ( tipomov=0
) 大于借方 ( tipomov=1
) 的总和?
这是我的尝试。虽然它没有引发错误,但结果是空的(这很容易检查,在给出的示例中不应该是这种情况)。事实上,它是空的,与检查更大、相等或更小的总和无关。
SELECT noconta
FROM MOVIMENTO
WHERE ((SELECT YEAR(datarealizacao)) = 2018
AND (SELECT MONTH (datarealizacao))= 12)
GROUP BY noconta, tipomov
HAVING ((SELECT SUM(numerario) WHERE tipomov = 0) > (SELECT SUM(numerario) WHERE tipomov = 1));
解决方案
试试这个。
表架构:
CREATE TABLE #MOVIMENTO (noconta BIGINT,numerario INT, dataefectivacao DATETIME,datarealizacao DATETIME,tipomov INT,descricao NVARCHAR(1000))
INSERT INTO #MOVIMENTO VALUES('11111111111','58','2018-10-26 00:00:00','2018-10-24 00:00:00','0','Movimento Genérico 6-1 (Não Dezembro 2018) (Crédito)')
INSERT INTO #MOVIMENTO VALUES('11111111111','11','2018-12-27 00:00:00','2018-10-25 00:00:00','1','Movimento Genérico 7-1 (Não Dezembro 2018) (Débito) ')
INSERT INTO #MOVIMENTO VALUES('11111111111','24','2018-12-14 00:00:00','2018-12-12 00:00:00','0','Movimento Genérico 1-1 (Crédito)')
INSERT INTO #MOVIMENTO VALUES('11111111111','42','2018-12-16 00:00:00','2018-12-13 00:00:00','0','Movimento Genérico 2-1 (Crédito)')
INSERT INTO #MOVIMENTO VALUES('11111111111','44','2018-12-17 00:00:00','2018-12-14 00:00:00','1','Movimento Genérico 4-1 (Débito) ')
INSERT INTO #MOVIMENTO VALUES('11111111111','31','2018-12-15 00:00:00','2018-12-18 00:00:00','1','Movimento Genérico 5-1 (Débito) ')
INSERT INTO #MOVIMENTO VALUES('11111111111','55','2018-12-22 00:00:00','2018-12-19 00:00:00','0','Movimento Genérico 3-1 (Crédito)')
INSERT INTO #MOVIMENTO VALUES('22222222222','45','2018-10-24 00:00:00','2018-10-22 00:00:00','0','Movimento Genérico 6-2 (Não Dezembro 2018) (Crédito)')
INSERT INTO #MOVIMENTO VALUES('22222222222','241','2018-12-12 00:00:00','2018-12-10 00:00:00','0','Movimento Genérico 1-2 (Crédito)')
INSERT INTO #MOVIMENTO VALUES('22222222222','12','2018-12-14 00:00:00','2018-12-11 00:00:00','0','Movimento Genérico 2-2 (Crédito)')
INSERT INTO #MOVIMENTO VALUES('22222222222','35','2018-12-15 00:00:00','2018-12-12 00:00:00','1','Movimento Genérico 4-2 (Débito) ')
INSERT INTO #MOVIMENTO VALUES('22222222222','22','2018-12-16 00:00:00','2018-12-13 00:00:00','1','Movimento Genérico 5-2 (Débito) ')
INSERT INTO #MOVIMENTO VALUES('22222222222','31','2018-12-20 00:00:00','2018-12-17 00:00:00','0','Movimento Genérico 3-2 (Crédito)')
INSERT INTO #MOVIMENTO VALUES('22222222222','23','2018-10-25 00:00:00','2018-12-23 00:00:00','1','Movimento Genérico 7-2 (Não Dezembro 2018) (Débito)')
INSERT INTO #MOVIMENTO VALUES('33333333333','51','2018-10-22 00:00:00','2018-10-20 00:00:00','0','Movimento Genérico 6-3 (Não Dezembro 2018) (Crédito)')
INSERT INTO #MOVIMENTO VALUES('33333333333','241','2018-12-09 00:00:00','2018-12-07 00:00:00','0','Movimento Genérico 1-3 (Crédito)')
INSERT INTO #MOVIMENTO VALUES('33333333333','15','2018-12-13 00:00:00','2018-12-10 00:00:00','1','Movimento Genérico 4-3 (Débito)')
INSERT INTO #MOVIMENTO VALUES('33333333333','41','2018-12-14 00:00:00','2018-12-11 00:00:00','1','Movimento Genérico 5-3 (Débito)')
INSERT INTO #MOVIMENTO VALUES('33333333333','92','2018-10-23 00:00:00','2018-12-21 00:00:00','1','Movimento Genérico 7-3 (Não Dezembro 2018) (Débito)')
TSQL 查询:
SELECT noconta
FROM #MOVIMENTO
WHERE '2018-12-01' <= datarealizacao and datarealizacao < '2019-01-01'
GROUP BY noconta
HAVING SUM(CASE WHEN tipomov = 0 THEN numerario END)>SUM(CASE WHEN tipomov = 1 THEN numerario END)
输出:
noconta
11111111111
22222222222
33333333333