【问题标题】:Pass value in a Variable在变量中传递值
【发布时间】:2015-11-14 02:58:18
【问题描述】:

我想将 SELECT 语句中的 1 列的值传递给变量。

这是我的示例代码:

DECLARE @TotalExpense DECIMAL(18,2)
SELECT a.[Posting Date] AS [Check Date],
    a.[Document No_] AS [Check Number],
    a.[Vendor No_],
    (
    SELECT SUM(CASE WHEN GLEntry.[VAT Amount] <> 0 THEN CAST(GLEntry.Amount AS DECIMAL(18,2)) ELSE 0 END) FROM [BLI$Detailed Vendor Ledg_ Entry] DtldVendLedger
    LEFT JOIN [BLI$G_L Entry] GLEntry
    ON GLEntry.[Document No_] = (SELECT VendLedger.[Document No_] FROM [BLI$Vendor Ledger Entry] VendLedger
                                 WHERE VendLedger.[Entry No_] = DtldVendLedger.[Vendor Ledger Entry No_])
    WHERE DtldVendLedger.[Entry Type] = 2 AND DtldVendLedger.[Initial Document Type] = 2 AND DtldVendLedger.[Document No_] = a.[Document No_]
        AND GLEntry.[Source Code] = 'PURCHASES' AND GLEntry.[G_L Account No_] NOT IN ('2003','1402','1403','1401')
    ) AS [Vatable],

    (
    SELECT SUM(CASE WHEN GLEntry.[VAT Amount] <> 0 THEN CAST(GLEntry.Amount * 0.12 AS DECIMAL(18,2)) ELSE 0 END) FROM [BLI$Detailed Vendor Ledg_ Entry] DtldVendLedger
    LEFT JOIN [BLI$G_L Entry] GLEntry
    ON GLEntry.[Document No_] = (SELECT VendLedger.[Document No_] FROM [BLI$Vendor Ledger Entry] VendLedger
                                 WHERE VendLedger.[Entry No_] = DtldVendLedger.[Vendor Ledger Entry No_])
    WHERE DtldVendLedger.[Entry Type] = 2 AND DtldVendLedger.[Initial Document Type] = 2 AND DtldVendLedger.[Document No_] = a.[Document No_]
        AND GLEntry.[Source Code] = 'PURCHASES' AND GLEntry.[G_L Account No_] NOT IN ('2003','1402','1403','1401')
    ) AS [Input Tax],

    (
    SELECT SUM(CASE WHEN GLEntry.[VAT Amount] = 0 THEN CAST(GLEntry.Amount AS DECIMAL(18,2)) ELSE 0 END) FROM [BLI$Detailed Vendor Ledg_ Entry] DtldVendLedger
    LEFT JOIN [BLI$G_L Entry] GLEntry
    ON GLEntry.[Document No_] = (SELECT VendLedger.[Document No_] FROM [BLI$Vendor Ledger Entry] VendLedger
                                 WHERE VendLedger.[Entry No_] = DtldVendLedger.[Vendor Ledger Entry No_])
    WHERE DtldVendLedger.[Entry Type] = 2 AND DtldVendLedger.[Initial Document Type] = 2 AND DtldVendLedger.[Document No_] = a.[Document No_]
        AND GLEntry.[Source Code] = 'PURCHASES' AND GLEntry.[G_L Account No_] NOT IN ('2003','1402','1403','1401')
    ) AS [Non-Vat]

我想对增值税、进项税和非增值税求和,然后将值传递给一个变量,然后该变量将在我的 SELECT 语句中使用。

【问题讨论】:

  • 您可以在此查询之上使用选择查询来显示总和,或者您可以修改现有查询以将总和作为一列获取。如果你能从这里拿走,很好,否则发布更多关于你下一步想要什么的细节。

标签: sql sql-server-2008 sql-server-2005-express dynamics-nav


【解决方案1】:

我尝试重新排列您的查询。在您的查询中,连接条件中带有 DtldVendLedger 查询的部分应该是无效的。如果你让它运行,我不知道该怎么做。

由于我认为您求和的方式,我认为您使用外部联接还是内部联接并不重要。无论如何,带有 null GLEntry 的行都算为零。

DECLARE @vatable DECIMAL(18, 2);
DECLARE @inputtax DECIMAL(18, 2);
DECLARE @nonvat DECIMAL(18, 2);

SELECT
    @vatable = SUM(
        CASE
            WHEN GLEntry.[VAT Amount] <> 0
            THEN CAST(GLEntry.Amount AS DECIMAL(18,2)) ELSE 0 END
    ),
    @nonvat = SUM(
        CASE
            WHEN GLEntry.[VAT Amount]  = 0
            THEN CAST(GLEntry.Amount AS DECIMAL(18,2)) ELSE 0 END
    )
FROM
    A as a /* I'm assuming there was a FROM referencing a table "a" */
    [BLI$Detailed Vendor Ledg_ Entry] DtldVendLedger
    INNER JOIN
        ON DtldVendLedger.[Document No_] = a.[Document No_]
    LEFT OUTER JOIN [BLI$Vendor Ledger Entry] VendLedger
        ON VendLedger.[Entry No_] = DtldVendLedger.[Vendor Ledger Entry No_]
    LEFT OUTER JOIN [BLI$G_L Entry] GLEntry
        ON GLEntry.[Document No_] = VendLedger.[Document No_]
WHERE 
        a.??? = ???
    AND DtldVendLedger.[Entry Type] = 2
    AND DtldVendLedger.[Initial Document Type] = 2 
    AND GLEntry.[Source Code] = 'PURCHASES'
    AND GLEntry.[G_L Account No_] NOT IN ('2003','1402','1403','1401');

SET @inputtax = 0.12 * @vatable;

【讨论】:

  • 哇!肖恩特!谢谢你这个!!!很抱歉我的代码不完整,但你仍然设法重新编码它太棒了!再次感谢肖恩特爵士的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多