通过 SQL 脚本进行数据验证

问题描述 投票:0回答:1

我在这里寻找一些帮助来编写一个 SELECT 语句,该语句也将为我进行一些数据验证。

这是表格的例子:

发票行 ID 发票号 订单项成本(收取美元) 总发票金额
1 VIK123 1000 1100
2 VIK123 100 1100
1 VIK456 2000 2200
2 VIK456 200 2200

我想要一行代码,用于汇总发票编号 VIK123 的发票行 ID 1 和 2 的行项目成本(收取美元),并将其与总发票金额中的值进行比较。我的想法是,这将是一个案例陈述,其中“真”导致“已验证”,“假”导致“价格差异”。

我想 SELECT 语句看起来像这样......

SELECT col1, 
col2, 
...

CASE 
   WHEN SUM([Line Item Cost] WHERE [Invoice No] = [Invoice No]) = MAX([Total Invoice Amount] WHERE     
   [Invoice No] = [Invoice No]) THEN 'Validated'
      ELSE 'Price Discrepancy'
   END AS [Validation]

FROM [table]
GROUP BY ...
ORDER BY ...

如果需要,我可以提供一些额外的信息。

[Line Item Cost (Collect USD)] 与代码中的 [Collect USD] 相同,我只是这样引用它,以便更容易理解(希望如此)。

我目前在 [Line Item Cost (Collect USD)] 和 [Total Invoice Amount] 上使用 CAST 函数将它们从 varchar(100) 转换为 decimal(18,5)。

我还使用临时表来保存大部分查询,然后使用辅助 SELECT 语句将临时表连接到另一个引用表。我认为这在第二个 select 语句中处理得更优雅。

这里是额外参考的全部内容:

SET NOCOUNT ON;

DROP TABLE IF EXISTS #temp

SELECT * INTO #temp
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY ai.[Invoice No] ASC) AS [Invoice Line ID]
        ,ISNULL(ai.[Supplier Code], 'No Supplier Code Found') as [Supplier Code]
        ,ISNULL(ai.[Invoice No], 'No Invoice No Found') as [Invoice No]
        ,PARSE(ai.[Invoice Date] AS DATE USING 'en-US') as [Invoice Date]
        ,PARSE(ai.[Received Date] AS DATE USING 'en-US') as [Batch Date]
        ,REPLACE(RIGHT(CONVERT(VARCHAR(10),(PARSE(ai.[Invoice Date] AS DATE USING 'en-US')),103),7), '/', '-') as [Period]
        ,ISNULL(REPLACE(ai.[Master B/L No], '*', ''), 'No Master B/L No Found') as [Master B/L No]
        ,PARSE(ai.[On Board Date] AS DATE USING 'en-US') as [On Board Date]
        ,ISNULL(REPLACE(ai.[Ocean Vessel & Voyage], 'Ocean Vessel ', ''), 'No Ocean Vessel & Voyage Found') as [Ocean Vessel and Voyage]
        ,ISNULL(REPLACE(ai.[No of Cartons], 'CTNS', ''), 'No Cartons Found') as [No of Cartons]
        ,ISNULL(REPLACE(ai.[No of Pallets], 'PLTS', ''), 'No Pallets Found') as [No of Pallets]
        ,ISNULL(CONCAT('[',LEFT(ai.[Container No], CHARINDEX('/', ai.[Container No]) - 1),']'), 'No Container No Found') as [Container No]
        ,ISNULL(ai.[Port of Discharge], 'No Port of Discharge Found') as [Port of Discharge]
        ,ISNULL(ai.[Place of Delivery], 'No Place of Delivery Found') as [Place of Delivery]
        ,ISNULL(ai.[Final Destination], 'No Final Destination Found') as [Final Destination]
        ,CAST(CAST((REPLACE(ai.[Gross Weight (KG)], ' KGS', '')) as decimal(18,5)) as float) as [Gross Weight KG]
        ,ISNULL(REPLACE(ai.[H B/L No], '*', ''), 'No H B/L No Found') as [H BL No]
        ,ISNULL(REPLACE(ai.[Consignee], ',', ''), 'No Consignee Found') as [Consignee]
        ,ISNULL(ai.[Volume], 'No Volume Found') as [Volume]
        ,ISNULL(ai.[Item], 'No Item Found') as [Item]
        ,ISNULL(ai.[Prepaid], 'No Prepaid Found') as [Prepaid]
        ,CAST(ai.[Collect (USD)] as decimal(18,5)) as [Collect USD]
        ,CAST(ai.[Total Invoice Amount] as decimal(18,5)) as [Total Invoice Amount]
        ,CASE
            WHEN ai.[Port of Discharge] LIKE '%LONG BEACH%' 
            OR ai.[Port of Discharge] LIKE '%LOS ANGELES%' 
            OR ai.[Port of Discharge] LIKE '%TACOMA%' 
            OR ai.[Port of Discharge] LIKE '%VANCOUVER%'
            OR ai.[Port of Discharge] LIKE '%NEW YORK%'
            OR ai.[Port of Discharge] LIKE '%SEATTLE%'
            AND ai.[Final Destination] IS NULL
                THEN 'GRAND RAPIDS, MI'
                ELSE ISNULL(ai.[Final Destination], 'No Warehouse Found')
            END as [Warehouse]
        ,CASE
            WHEN ai.[Consignee] LIKE '%VIKING PRODUCTS INC.%' AND ai.[Item] LIKE '%OCEAN FREIGHT%' THEN '51-512000-VIK'
            WHEN ai.[Consignee] LIKE '%VIKING PRODUCTS DE M%' AND ai.[Item] LIKE '%OCEAN FREIGHT%' THEN '51-512050-VIK'
            WHEN ai.[Item] LIKE '%ORIGIN EXAM FEE%' OR ai.[Item] LIKE '%ISF%' THEN '51-514000-VIK'
                ELSE 'Account No Not Found'
            END as [Account No]
        FROM [DWH].[vplx].[AP_Invoice_Detail] ai
        WHERE 1=1
            AND CHARINDEX('/', [Container No]) > 0
    ) as t

SELECT t.*, 
    aj.[accounting_job_no] as [Accounting Job No]
    FROM #temp t
LEFT JOIN [plx].[Accounting_v_Accounting_Job_e_lookup] aj
    ON (t.[Warehouse] = aj.[final_dest_one]) OR
    (t.[Warehouse] = aj.[final_dest_two]) OR
    (t.[Warehouse] = aj.[final_dest_three]) OR
    (t.[Warehouse] = aj.[final_dest_four]) OR
    (t.[Warehouse] = aj.[final_dest_five]) OR
    (t.[Warehouse] = aj.[final_dest_six]) OR
    (t.[Warehouse] = aj.[final_dest_seven])
ORDER BY t.[Invoice No] asc

如有任何帮助,我们将不胜感激。

sql-server select sum max temp-tables
1个回答
0
投票

请尝试以下解决方案。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (InvoiceLineID INT,InvoiceNo VARCHAR(10), LineItemCost MONEY, TotalInvoiceAmount MONEY);
INSERT @tbl (InvoiceLineID, InvoiceNo, LineItemCost, TotalInvoiceAmount) VALUES
(1, 'VIK123', 1000, 1100),
(2, 'VIK123', 100,  1100),
(1, 'VIK456', 2000, 2200),
(2, 'VIK456', 200,  2200);
-- DDL and sample data population, end

;WITH rs AS
(
    SELECT *
        , InvoiceTotal = SUM(LineItemCost) OVER (PARTITION BY InvoiceNo)
    FROM @tbl
)
SELECT * 
    , result = IIF(TotalInvoiceAmount = InvoiceTotal, 'Validated', 'Price Discrepancy')
FROM rs;

输出

发票行编号 发票号 LineItemCost 总发票金额 发票合计 结果
1 VIK123 1000.00 1100.00 1100.00 已验证
2 VIK123 100.00 1100.00 1100.00 已验证
1 VIK456 2000.00 2200.00 2200.00 已验证
2 VIK456 200.00 2200.00 2200.00 已验证
© www.soinside.com 2019 - 2024. All rights reserved.