首页 > 解决方案 > 为什么此 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));

标签: sql-servertsql

解决方案


试试这个。

表架构:

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

推荐阅读