计算同一表中同一列但不同类别的值

时间:2019-10-15 05:35:17

标签: sql sql-server

我尝试通过此查询获取SUM的值

SELECT SUM(nominal) Total_Pemasukan FROM kas WHERE jenis = 'Masuk' AND tanggal = '2019-10-14'

SELECT SUM(nominal) Total_Pengeluaran FROM kas WHERE jenis = 'Keluar' AND tanggal = '2019-10-14'

但是我不知道如何在基于类别的表中实现减法,我只想减去第一个和第二个查询。

我希望这样的最终结果

500 - 300 = 200

这是我的餐桌设计

keterangan |    tanggal     |   jenis | nominal

A,              2019-10-14,     Masuk,  500

B,              2019-10-14,     Keluar, 300

3 个答案:

答案 0 :(得分:1)

做这种事情的几种方法。作为另一个SELECT中的子查询:

SELECT 
  (SELECT SUM(nominal) Total_Pemasukan FROM kas WHERE jenis = 'Masuk' AND tanggal = '2019-10-14')
  -
  (SELECT SUM(nominal) Total_Pengeluaran FROM kas WHERE jenis = 'Keluar' AND tanggal = '2019-10-14')

或者通过交叉联接的子查询(交叉联接将a中的每一行与b中的每一行相关联。在这种情况下,因为a和b分别有一行,我们不会获得重复的数据)

SELECT 
  m.Total_Pemasukan - k.Total_Pemasukan
FROM
  (SELECT SUM(nominal) Total_Pemasukan FROM kas WHERE jenis = 'Masuk' AND tanggal = '2019-10-14') M
  CROSS JOIN 
  (SELECT SUM(nominal) Total_Pengeluaran FROM kas WHERE jenis = 'Keluar' AND tanggal = '2019-10-14') K

或通过条件agg:

SELECT 
  SUM(CASE jenis WHEN 'masuk' THEN nominal END) -
    SUM(CASE jenis WHEN 'keluar' THEN nominal END) Total_Pemasukan 
FROM kas 
WHERE jenis IN ( 'Masuk', 'keluar') AND tanggal = '2019-10-14'

相对于将查询放入选择列表,我更喜欢后两个,但是哪个会更好地执行取决于环境/索引-试试看!

答案 1 :(得分:0)

将它们分组为subqueries,然后执行substraction

SELECT 
    (SELECT SUM(nominal) Total_Pemasukan
        FROM kas WHERE jenis = 'Masuk' AND tanggal = '2019-10-14') 
    - 
    (SELECT SUM(nominal) Total_Pengeluaran 
        FROM kas WHERE jenis = 'Keluar' AND tanggal = '2019-10-14')

答案 2 :(得分:0)

您可以尝试以下方法:

SELECT SUM(nominal) FROM (
    SELECT nominal FROM kas WHERE jenis = 'Masuk' AND tanggal = '2019-10-14'
    UNION ALL
    SELECT -nominal FROM kas WHERE jenis = 'Keluar' AND tanggal = '2019-10-14'
) a