0

我一直在努力寻找这个问题的答案。这是我维护的代码,没有错误。它位于为报表返回数据的存储过程中。

为了便于阅读,我把它缩小了,只包括了基本部分。

它可以正常工作,但已请求将所有相关数据分组到相应的行中。

主要问题是将 GROUP BY 语句应用于包含 SUBQUERY 的第三个 CASE 语句:

    SELECT
            CompanyName,
            CompanyRef,
            Amount,
            Reference,
            VendorNo,
            CASE ErrorID WHEN 10 'Company Name: ' + CompanyName + 'CompanyRef' END AS InvalidCompanyNameForRef,
            CASE ErrorID WHEN 11 'Vendor Number:' + VendorNo END AS InvalidVendorNo,
            CASE ErrorID WHEN 12 (SELECT TOP(1) 'Non VAT Amount:' + CAST(PendingPayments.NonVatAmount AS varchar) + 'Import Amount:' + CAST(Imported.PaymentAmount) FROM PendingPayments
                        WHERE  Imported.CompanyRef = PendingPayments.CompanyRef
                           AND Imported.VendorNo = PendingPayments.VendorNo
                               AND ISNUMERIC(Imported.PaymentAmount) = 1
                           AND CAST(Imported.PaymentAmount AS MONEY) <> PendingPayments.NonVatAmount AND PendingPayments.isVAT = 0      
                         ) END As PaymentAmountMismatch
        .
        .
        .
GROUP BY
            CompanyName,
            CompanyRef,
            Amount,
            Reference,
            VendorNo,
            CASE ErrorID WHEN 10 'Company Name: ' + CompanyName + 'CompanyRef' END,
            CASE ErrorID WHEN 11 'Vendor Number:' + VendorNo END

如何按从 SUBQUERY 派生的字段对其进行分组。

而不是为相同数据的不同列返回不同的行,我希望它返回如下内容:

CompanyName | CompanyRef | Amount | Reference | VendorNo | InvalidCompanyNameForRef     | Invalid Vendor Number | PaymentAmountMismatch
------------+------------+--------+-----------+----------+------------------------------+-----------------------+-----------------------------------------+
ABC         | 1          | 25.00  | INV001    |390       |Company Name: ABC CompanyRef:1|                       |   
DEF         | 5          | 12.00  | INV002    |212       |                              |                   212 |Expected Amount:12.50, Import Amount:12.00
HIJ         | 7          | 9.50   | INV003    |31        |Company Name: HIJ CompanyRef:7|                       |
4

1 回答 1

1

在我看来,CTE 可以帮助你。代码没有经过测试,但我认为它足以得到想法。

    WITH cte 
           (CompanyName,
            CompanyRef,
            Amount,
            Reference,
            VendorNo,
            InvalidCompanyNameForRef,
            InvalidVendorNo,
            PaymentAmountMismatch) AS
(
SELECT
CompanyName,
CompanyRef,
Amount,
Reference,
VendorNo,
CASE ErrorID WHEN 10 'Company Name: ' + CompanyName + 'CompanyRef' END AS InvalidCompanyNameForRef,
CASE ErrorID WHEN 11 'Vendor Number:' + VendorNo END AS InvalidVendorNo,
CASE ErrorID WHEN 12 (SELECT TOP(1) 'Non VAT Amount:' + CAST(PendingPayments.NonVatAmount AS varchar) + 'Import Amount:' + CAST(Imported.PaymentAmount) FROM PendingPayments
            WHERE  Imported.CompanyRef = PendingPayments.CompanyRef
                AND Imported.VendorNo = PendingPayments.VendorNo
                    AND ISNUMERIC(Imported.PaymentAmount) = 1
                AND CAST(Imported.PaymentAmount AS MONEY) <> PendingPayments.NonVatAmount AND PendingPayments.isVAT = 0      
                ) END As PaymentAmountMismatch
)
SELECT * FROM cte 
GROUP BY
    CompanyName,
    CompanyRef,
    Amount,
    Reference,
    VendorNo,
    InvalidCompanyNameForRef,
    InvalidVendorNo,
    PaymentAmountMismatch
于 2013-07-04T11:33:08.410 回答