如何将已完成的项目按交易月份分成几列?

How do I sum items fulfilled split into columns by transaction month?

我正在尝试使用与我的 Netsuite 数据库的 ODBC 连接来汇总每个月的商品销售额。我 运行 使用 Microsoft Excel 的数据库连接进行查询,所以我 认为 它使用的是 T-SQL 标准,至少从我试过的。

我写这个查询是为了给我一份来自项目履行交易的项目列表。具有实际 item_id 的行项目存储在 TRANSACTION_LINES table 中,交易类型在 TRANSACTIONS table 中,因此连接。

SELECT trandate
    ,item_id
    ,item_count
FROM Administrator.TRANSACTIONS
    ,Administrator.TRANSACTION_LINES
WHERE Administrator.TRANSACTIONS.transaction_id = Administrator.TRANSACTION_LINES.transaction_id
    AND trandate >= TRUNC(ADD_MONTHS(GETDATE(), - 6), 'month')
    AND transaction_type = 'Item Fulfillment'

这给了我一个 table 像这样:

trandate        item_id     item_count
2/3/2016 0:00   13035       -2
2/3/2016 0:00   13035       2
2/3/2016 0:00   13035       -2
2/3/2016 0:00   2809        -2
2/3/2016 0:00   2809        2
2/3/2016 0:00   2809        -2
2/3/2016 0:00   13049       -2
2/3/2016 0:00   13049       2
2/3/2016 0:00   13049       -2
2/3/2016 0:00   13111       -2
2/3/2016 0:00   13111       2
2/3/2016 0:00   13111       -2
2/2/2016 0:00   13103       -1
2/2/2016 0:00   13103       1
2/2/2016 0:00   13103       -1
2/2/2016 0:00   195712      -2
2/1/2016 0:00   213120      -2
2/1/2016 0:00   213120      2
2/1/2016 0:00   213120      -2
2/1/2016 0:00   213122      -2
2/1/2016 0:00   213122      2
2/1/2016 0:00   213122      -2

你可以想象这会持续一段时间,因为一切都可以追溯到八月。我认为交替否定是 Netsuite 对股票对不同账户的影响所做的事情,尽管如果有人也想为此提供更多见解,我将不胜感激

所以现在我尝试使用 case when 和总和来调整此查询。我只打算放置第一个月的列,因为接下来的月份是相同的,-1 相应地改变了。我还否定了数量,因此总和将为正数。

SELECT A.item_id
    ,sum(CASE 
            WHEN A.trandate BETWEEN TRUNC(ADD_MONTHS(GETDATE(), - 1), 'month')
                    AND LAST_DAY(ADD_MONTHS(GETDATE(), - 1))
                THEN - 1 * A.item_count
            ELSE 0
            END) as OneMonthSales
FROM (--the query we defined earlier, now as a subquery
    SELECT trandate
        ,item_id
        ,item_count
    FROM Administrator.TRANSACTIONS
        ,Administrator.TRANSACTION_LINES
    WHERE Administrator.TRANSACTIONS.transaction_id = Administrator.TRANSACTION_LINES.transaction_id
        AND trandate >= TRUNC(ADD_MONTHS(GETDATE(), - 6), 'month')
        AND transaction_type = 'Item Fulfillment'
    ) AS A
group by A.item_id

Excel 不想执行此查询。

如果我从 group by A.item_id 中删除 A. 前缀,我会得到同样的错误。 如果我注释掉 group by 子句,查询将执行 return 带有 item_id 的 table 和一个月销售额的一列,但是 item_id 行仍然重复(似乎更多次)。这对我来说似乎很奇怪,因为我认为不在聚合函数中的每一列都需要在 group by 子句中,否则它应该抛出错误。

我该如何修复此查询,以便它能够正确调整并计算每个 item_id 的数量?如果我能让它工作一个月,我可能可以根据需要延长它。

我将查询包装在另一个 select 语句中,如下所示:

--get sales data
SELECT item_id, sum(OneMonthSales)
FROM (
    SELECT item_id
        ,sum(CASE 
                WHEN A.trandate BETWEEN TRUNC(ADD_MONTHS(GETDATE(), - 1), 'month')
                        AND LAST_DAY(ADD_MONTHS(GETDATE(), - 1))
                    THEN - 1 * A.item_count
                ELSE 0
                END) as OneMonthSales
    FROM (
        SELECT trandate
            ,item_id
            ,item_count
        FROM Administrator.TRANSACTIONS
            ,Administrator.TRANSACTION_LINES
        WHERE Administrator.TRANSACTIONS.transaction_id = Administrator.TRANSACTION_LINES.transaction_id
            AND trandate >= TRUNC(ADD_MONTHS(GETDATE(), - 6), 'month')
            AND transaction_type = 'Item Fulfillment'
        ) AS A
)
group by item_id

这符合我的预期,但如果有人可以提供一个没有这个的答案,或者一个解释为什么有必要的答案,我会接受那个答案。