【问题标题】:SQL Server : sum two columnsSQL Server:对两列求和
【发布时间】:2018-06-23 00:04:07
【问题描述】:

我有以下 SQL 语句,它显示了来自销售点系统的交易。我想计算(MoneyIn - MoneyOut) 列的总和,但有点超出我的范围,并将其显示为单个值。我确信它是一个简单的模型。

DECLARE @StartDate DateTime;
DECLARE @EndDate DateTime;
DECLARE @SearchTerm NVARCHAR(200);

SET @SearchTerm = '%widget1%'
SET @StartDate = '2018-05-01 00:00:00'
SET @EndDate = DATEADD(month, 1, @StartDate)

SELECT TOP (500)
    t.TransactionDate,
    t.MoneyIn,
    t.MoneyOut,
    t.Description,
    p.PaymentMethodName,
    t.TransactionRef,
    c.SalesItems,
    COUNT(*) AS Occurrences
FROM
    Transactions t
LEFT JOIN 
    Tills tl ON t.TillId = tl.TillId
INNER JOIN 
    PaymentMethods p ON t.PaymentMethodId = p.PaymentMethodsID
INNER JOIN 
    Membership m ON t.UserId = m.UserId
CROSS APPLY
    (SELECT 
         STUFF((SELECT ',' + CAST(tp.Description AS VARCHAR(100))
                FROM TransactionsPosLines tp
                WHERE t.TransactionId = tp.TransactionId
                FOR XML PATH('')), 1, 1, '') AS SalesItems) c
WHERE
    t.TransactionDate >= @StartDate
    AND t.TransactionDate <= @EndDate
    AND (t.PaymentTypeId = 1)
    AND SalesItems LIKE @SearchTerm
GROUP BY
    t.TransactionDate,
    t.MoneyIn,
    t.MoneyOut,
    t.Description,
    p.PaymentMethodName,
    t.TransactionRef,
    m.Username,
    c.SalesItems
ORDER BY 
    COUNT(*) DESC

输出:

2018-05-01 17:23:23.243 9.99    0.00    Sale - Card Card    Shop Sale   Grab n Go item  1
2018-05-08 13:15:04.577 10.00   -0.01   Sale - Cash Total: 9.99 Cash    Shop Sale   Grab n Go item  1
2018-05-10 14:08:47.120 7.99    0.00    Sale - Card Card    Shop Sale   Grab n Go item,Discount 1

我想展示:

总销售额:27.97

(MoneyIn 的总和 - MoneyOut 的总和)

【问题讨论】:

  • 您是要合并这三个记录还是添加一个额外的字段?
  • @DanielMarcus 我正在尝试巩固.. 只是想总结一下 MoneyIn - MoneyOut 的列并为此提供价值?
  • 所以只需从最终结果集中选择 sum(MoneyIn)-sum(MoneyOut)
  • @DanielMarcus 我确实试过这个,但让我再试一次......
  • 从组中删除 moneyin 和 moneyout,然后 sum(moneyin) - sum(moneyout) as moneytotal

标签: sql-server tsql


【解决方案1】:

这样这个问题就有答案了

(编辑:添加了我用来解决此问题的实际 SQL,这给出了我正在寻找的单一结果),感谢您的帮助:

Select top (10000)
    sum(t.MoneyIn) - sum(t.MoneyOut) as 'moneytotal'
From
    Transactions t
    LEFT JOIN  Tills tl
    ON t.TillId = tl.TillId
    INNER JOIN PaymentMethods p
    ON t.PaymentMethodId = p.PaymentMethodsID
    INNER JOIN Membership m
    On t.UserId = m.UserId
    CROSS APPLY
    (SELECT STUFF(
        (SELECT ',' + CAST(tp.Description AS VARCHAR(100))
        FROM
        TransactionsPosLines tp
        WHERE t.TransactionId = tp.TransactionId
        FOR XML PATH(''))
        ,1,1,'') as SalesItems) c
Where
    t.TransactionDate >= @StartDate
    AND t.TransactionDate <= @EndDate
        AND (t.PaymentTypeId = 1)
        and SalesItems LIKE @SearchTerm

        Order By
  count(*) Desc

  GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2021-03-03
    • 1970-01-01
    • 2020-01-29
    相关资源
    最近更新 更多