请原谅我用谷歌翻译的英语翻译。
我需要在没有php或其他语言的MySQL查询中解决以下问题:
在“A”列中,我有一个字符串值,在“B”和“C”列中,我有一个数值。“D”列应该等于B - C,只要“A”列具有相同的值。下面是一个例子:
A B C D
Data1 10 2 8
Data1 2 6
Data2 50 2 48
Data2 10 38@ real,真正的疑问
A=sim_items_djai_declaacancelar
B=sim_items_djai_cantidaddec
C=sim_items_djai_decla_cantidaddec
D=_varSaldo2d
注意:在查询中,只对UNION的第一部分进行计算,其中_varSaldo2d为0
(SELECT
cmn_lst_clientes._desc AS cmn_lst_clientes_desc,
cmn_lst_clientes_un._desc AS cmn_lst_clientes_un_desc,
sim_items_djai_decla._declaacancelar AS sim_items_djai_declaacancelar,
sim_caratula._oficializacion AS sim_caratula_oficializacion,
opr_djai_estado._fb AS opr_djai_estado_fb,
opr_djai_estado._fv AS opr_djai_estado_fv,
sim_items_djai_decla._itemacancelar AS sim_items_djai_decla_itemacancelar,
opr_lst_djai_estados._descesAR as opr_lst_djai_estados_desc,
sim_items_djai._cantidaddec as sim_items_djai_cantidaddec,
sim_lst_um._descesAR as sim_lst_um_desc,
sim_items_djai_decla._destsimn as sim_items_djai_decla_destsimn,
sim_items_djai_decla._oficializacion AS sim_items_djai_decla_oficializacion,
sim_items_djai_decla._item as sim_items_djai_decla_item,
sim_items_djai_decla._cantidaddec as sim_items_djai_decla_cantidaddec,
0 as _varSaldo2d
FROM
sim_items AS sim_items_djai_decla USE INDEX (_declaacancelar)
INNER JOIN sim_caratula USE INDEX (PRIMARY) ON sim_items_djai_decla._declaacancelar = sim_caratula._destsimn AND sim_caratula._destsim = 'SIMI'
INNER JOIN opr_djai_estado USE INDEX (_destsimnitem) ON sim_items_djai_decla._declaacancelar = opr_djai_estado._destsimn AND sim_items_djai_decla._itemacancelar = opr_djai_estado._item
INNER JOIN opr_lst_djai_estados USE INDEX (PRIMARY) ON opr_djai_estado._estado = opr_lst_djai_estados._id
LEFT JOIN sim_items AS sim_items_djai USE INDEX (PRIMARY) ON opr_djai_estado._destsimn = sim_items_djai._destsimn AND opr_djai_estado._oficializacion = sim_items_djai._oficializacion AND opr_djai_estado._item = sim_items_djai._item
INNER JOIN sim_lst_um USE INDEX (PRIMARY) ON sim_items_djai._unidaddec = sim_lst_um._id
INNER JOIN opr_djai USE INDEX (PRIMARY) ON opr_djai_estado._destsimn = opr_djai._destsimn AND opr_djai_estado._oficializacion = opr_djai._oficializacion
INNER JOIN cmn_lst_clientes USE INDEX (PRIMARY) ON opr_djai._cliente = cmn_lst_clientes._id
INNER JOIN cmn_lst_clientes_un USE INDEX (PRIMARY) ON opr_djai._cliente = cmn_lst_clientes_un._cliente AND opr_djai._un = cmn_lst_clientes_un._un
WHERE
(sim_caratula._oficializacion >= '2015-12-22'
and sim_caratula._oficializacion <= '2016-04-29')
and opr_djai._cliente = '61'
GROUP BY
sim_items_djai_decla._declaacancelar,
sim_items_djai_decla._itemacancelar,
sim_items_djai_decla._destsimn)
UNION
(SELECT
cmn_lst_clientes._desc AS cmn_lst_clientes_desc,
cmn_lst_clientes_un._desc AS cmn_lst_clientes_un_desc,
sim_items_djai_decla._destsimn AS sim_items_djai_declaacancelar,
sim_items_djai_decla._oficializacion AS sim_caratula_oficializacion,
opr_djai_estado._fb AS opr_djai_estado_fb,
opr_djai_estado._fv AS opr_djai_estado_fv,
sim_items_djai_decla._item AS sim_items_djai_decla_itemacancelar,
opr_lst_djai_estados._descesAR as opr_lst_djai_estados_desc,
sim_items_djai_decla._cantidaddec as sim_items_djai_cantidaddec,
sim_lst_um._descesAR as sim_lst_um_desc,
'' as sim_items_djai_decla_destsimn,
null AS sim_items_djai_decla_oficializacion,
'' as sim_items_djai_decla_item,
0 as sim_items_djai_decla_cantidaddec,
sim_items_djai_decla._cantidaddec as _varSaldo2d
FROM
sim_items AS sim_items_djai_decla USE INDEX (PRIMARY)
LEFT JOIN sim_caratula USE INDEX (PRIMARY) ON sim_items_djai_decla._declaacancelar = sim_caratula._destsimn AND sim_caratula._destsim = 'SIMI'
LEFT JOIN sim_items ON sim_items_djai_decla._destsimn = sim_items._declaacancelar AND sim_items_djai_decla._item = sim_items._itemacancelar
LEFT JOIN opr_djai ON sim_items_djai_decla._destsimn = opr_djai._destsimn AND sim_items_djai_decla._oficializacion = opr_djai._oficializacion
LEFT JOIN cmn_lst_clientes ON opr_djai._cliente = cmn_lst_clientes._id
LEFT JOIN cmn_lst_clientes_un ON opr_djai._cliente = cmn_lst_clientes_un._cliente AND opr_djai._un = cmn_lst_clientes_un._un
LEFT JOIN opr_djai_estado ON sim_items_djai_decla._destsimn = opr_djai_estado._destsimn AND sim_items_djai_decla._oficializacion = opr_djai_estado._oficializacion AND sim_items_djai_decla._item = opr_djai_estado._item
LEFT JOIN opr_lst_djai_estados ON opr_djai_estado._estado = opr_lst_djai_estados._id
LEFT JOIN sim_lst_um ON sim_items_djai_decla._unidaddec = sim_lst_um._id
WHERE
ISNULL(sim_items._declaacancelar)
AND sim_items_djai_decla._oficializacion >= '2015-12-22'
AND sim_items_djai_decla._oficializacion <= '2016-04-29'
and opr_djai._cliente = '61'
GROUP BY
sim_items_djai_decla._destsimn,
sim_items_djai_decla._oficializacion,
sim_items_djai_decla._item)
ORDER BY
sim_items_djai_declaacancelar,
sim_caratula_oficializacion,
sim_items_djai_decla_itemacancelar发布于 2016-05-02 00:25:24
不要以这种方式存储数据。以下列方式储存:
A B C D
Data1 10 2 8
Data1 10 2 6
Data2 50 2 48
Data2 50 10 38如果您想以另一种方式显示它,那就是应用程序要做的事情。不要试图在SQL中执行此操作。
这在SQL中是可能的,但它是丑陋的。如果你是从
A B C
Data1 10 2
Data1 2
Data2 50 2
Data2 10像这样的东西会产生你想要的东西。(然而,它将有几个额外的列。)
SELECT
t.A,
t.B,
t.C,
IF (t.A = @previous_A, @previous_B, t.B) - t.C AS D,
@previous_A := t.A,
@previous_B := t.B
FROM table AS t
JOIN ( SELECT @previous_A := '', @previous_B := 0 ) AS initialize
ORDER BY t.A ASC, t.B DESC您可以使用它作为子查询来丢弃额外的列。
https://dba.stackexchange.com/questions/137034
复制相似问题