【问题标题】:Can this Mysql query be amended to display invoice only once for the same idinvoice可以修改这个 Mysql 查询以对同一个 idinvoice 只显示一次发票吗
【发布时间】:2011-03-14 15:54:03
【问题描述】:

下面的查询

SELECT
<output name="c.name" title="Name" />,
<output name="c.reference" title="Reference No." />,
<output name="i.idinvoice" title="Invoice ID" />,
<output replace="(SUM(v.quantity * s.charges))/COUNT(i.idinvoice)" />As Invoice
<output replace="p.amount" />AS Amount,
<output replace="p.idpayment" title="Payment ID" />,
<output replace="p.cheque_no title="Cheque No" />,
<output replace="p.pdatetime" title="Processed Time" />,
<output replace="p.user" title="Processed By" type="user" attribute="username" />
FROM inv i
LEFT JOIN invitem v ON v.idinvoice = i.idinvoice
LEFT JOIN service s ON s.idservice = v.idservice
LEFT JOIN payment p ON p.idinvoice = i.idinvoice
LEFT JOIN address a ON a.idaddress = i.idaddress
LEFT JOIN client c ON c.idclient = a.idclient
WHERE a.idaddress = '<input name="idaddress" />'
GROUP BY i.idinvoice, p.amount, p.idpayment, p.cheque_no, p.pdatetime, p.user
ORDER BY i.idinvoice DESC

【问题讨论】:

    标签: mysql join group-by aggregate


    【解决方案1】:

    如果您只希望 idinvoice 显示一次,则您的 GROUP BY 应该只包含 IDINVOICE。您必须决定如何显示其他参数(SUM/AVG/random/none...)。

    SELECT
    <output name="c.name" title="Name" />,
    <output name="c.reference" title="Reference No." />,
    <output replace="i.idinvoice" title="Invoice ID" />,
    <output replace="(SUM(v.quantity * s.charges))/COUNT(i.idinvoice)" />AS Invoice,
    <output replace="(p.amount)" data="float" />As Amount,
    <output name="p.idpayment" title="Payment ID" />,
    <output replace="p.cheque_no" title="Cheque No" />,
    <output replace="p.pdatetime" title="Processed Time" />,
    <output replace="p.user" title="Processed By" type="user" attribute="username" />
    FROM inv i
    LEFT JOIN invitem v ON v.idinvoice = i.idinvoice
    LEFT JOIN service s ON s.idservice = v.idservice
    LEFT JOIN payment p ON i.idinvoice = p.idinvoice
    LEFT JOIN address a ON a.idaddress = i.idaddress
    LEFT JOIN client c ON c.idclient = a.idclient
    WHERE a.idaddress = '<input name="idaddress" />'
    GROUP BY i.idinvoice
    ORDER BY i.idinvoice DESC
    

    【讨论】:

    • 好的。因此,如果您只想为 invoiceID 295 显示一行,您希望在其他列中放入什么数据?例如,金额?
    • 如果我们可以使用与之前相同的 IF idinvoice 那么下一行、列 Amount 就不会显示
    • 这更像是一个 GUI 问题而不是 MySQL 问题。更改您的 GUI 以隐藏值或合并行 - 取决于您的 GUI 的功能。
    • 我可以这样做吗“IF((idinvoice == idinvoice-1),'',(SUM(v.quantity * s.charges))/COUNT(i.idinvoice)”(虽然是 idinvoice -1 不太对,应该是之前的idinvoice。如果我能得到之前的idinvoice 表达式,那么这可能行得通。
    • 下面的这个 sn-p 使用相同的 GUI,并且在发布时使数据可见。沿着同一条线走,我在想如果我能得到以前的 idinvoice 表达式,也可以这样做。 replace="IF(已发布,a.idaddress,'')
    猜你喜欢
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2010-10-01
    • 2013-06-23
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多