首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql在clause子句中传递一个变量

Mysql在clause子句中传递一个变量
EN

Stack Overflow用户
提问于 2019-11-05 04:33:17
回答 1查看 48关注 0票数 0

我有这样的疑问:

代码语言:javascript
复制
SELECT bp.id,
       bp.nomor_surat,
       bp.jumlah_setor,
       @sum := ROUND(SUM(
                     CASE
                         WHEN idc.vat = "Y"
                             THEN
                             (idc.nominal * idc.pcs) + (0.1 * ((idc.nominal * idc.pcs)))
                         ELSE (idc.nominal * idc.pcs)
                         END
                 ), 2)                      AS 'sum_invoice',
       @check := bp.jumlah_setor < ROUND(@sum,2) AS 'check',
       @kurang_bayar := ROUND(@sum,2) - bp.jumlah_setor AS 'insufficient_payment'

FROM bukti_penerimaan bp
         LEFT JOIN invoice i on bp.id = i.bukti_penerimaan_id
         LEFT JOIN invoice_detail id2 ON i.id = id2.invoice_id
         LEFT JOIN invoice_detail_child idc ON id2.id = idc.invoice_detail_id
GROUP BY bp.id
HAVING
    bp.jumlah_setor < ROUND(SUM(
        CASE
            WHEN idc.vat = "Y"
        THEN
            (idc.nominal * idc.pcs) + (0.1 * ((idc.nominal * idc.pcs)))
        ELSE (idc.nominal * idc.pcs)
        END
    ), 2)


+-----+-----------------------+--------------+--------------+-------+----------------------+
| id  | nomor_surat           | jumlah_setor | sum_invoice  | check | insufficient_payment |
+-----+-----------------------+--------------+--------------+-------+----------------------+
| 215 | 00002/JKT-TRM/2019/TS | 720078000.00 | 727078000.00 |     1 |           7000000.00 |
+-----+-----------------------+--------------+--------------+-------+----------------------+
1 row in set (0.00 sec)

当我将一个变量传递到这样的查询中时,我得到了一个不一致的查询结果:

代码语言:javascript
复制
SELECT bp.id,
       bp.nomor_surat,
       bp.jumlah_setor,
       @sum := ROUND(SUM(
                     CASE
                         WHEN idc.vat = "Y"
                             THEN
                             (idc.nominal * idc.pcs) + (0.1 * ((idc.nominal * idc.pcs)))
                         ELSE (idc.nominal * idc.pcs)
                         END
                 ), 2)                      AS 'sum_invoice',
       @check := bp.jumlah_setor < ROUND(@sum,2) AS 'check',
       @kurang_bayar := ROUND(@sum,2) - bp.jumlah_setor AS 'insufficient_payment'

FROM bukti_penerimaan bp
         LEFT JOIN invoice i on bp.id = i.bukti_penerimaan_id
         LEFT JOIN invoice_detail id2 ON i.id = id2.invoice_id
         LEFT JOIN invoice_detail_child idc ON id2.id = idc.invoice_detail_id
GROUP BY bp.id
HAVING
    @check = 1

我得到了这样的结果:

代码语言:javascript
复制
+-----+-----------------------+--------------+--------------+-------+----------------------+
| id  | nomor_surat           | jumlah_setor | sum_invoice  | check | insufficient_payment |
+-----+-----------------------+--------------+--------------+-------+----------------------+
| 214 | 00001/JKT-TRM/2019/TS | 225347030.40 | 209147030.40 |     1 |         501730969.60 |
| 216 | 00003/JKT-TRM/2019/TS |  45793500.00 |  45793500.00 |     1 |         163353530.40 |
+-----+-----------------------+--------------+--------------+-------+----------------------+
2 rows in set (0.01 sec)

奇怪的是,我再次在与上面相同的查询中运行,得到了Empty set (0.00 sec)

我的问题是,发生了什么事?我应该在一个过程中创建这个过程吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-05 04:42:43

来自手册

当引用在select表达式列表中赋值的变量时,拥有、分组和ORDER不按预期工作,因为表达式是在客户端上计算的,因此可以使用来自上一行的陈旧列值。

解决这一问题的一种方法是将查询包装为子查询,并在WHERE上添加一个check子句。

代码语言:javascript
复制
SELECT *
FROM (SELECT bp.id,
             bp.nomor_surat,
             bp.jumlah_setor,
             @sum := ROUND(SUM(
                           CASE
                               WHEN idc.vat = "Y"
                                   THEN
                                   (idc.nominal * idc.pcs) + (0.1 * ((idc.nominal * idc.pcs)))
                               ELSE (idc.nominal * idc.pcs)
                               END
                       ), 2)                      AS 'sum_invoice',
             @check := bp.jumlah_setor < ROUND(@sum,2) AS 'check',
             @kurang_bayar := ROUND(@sum,2) - bp.jumlah_setor AS 'insufficient_payment'

      FROM bukti_penerimaan bp
               LEFT JOIN invoice i on bp.id = i.bukti_penerimaan_id
               LEFT JOIN invoice_detail id2 ON i.id = id2.invoice_id
               LEFT JOIN invoice_detail_child idc ON id2.id = idc.invoice_detail_id
      GROUP BY bp.id
    )
WHERE check = 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58704552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档