如何按交易月对已履行的项目进行拆分?

时间:2016-02-03 17:29:13

标签: sql tsql odbc netsuite

我正在尝试使用与我的Netsuite数据库的ODBC连接来总结每个月的项目销售额。我正在使用Microsoft Excel的数据库连接运行查询,因此我认为它正在使用T-SQL标准,至少从我尝试的内容来判断。

我写了这个查询,给我一个项目履行交易的项目清单。具有实际item_id的行项目存储在TRANSACTION_LINES表中,并且事务类型位于TRANSACTIONS表中,因此是连接。

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'

这给了我一张这样的表格:

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不想执行此查询。 excel refuses to execute query

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

如何修复此查询以使其正确旋转并将每个item_id的数量相加?如果我可以让它工作一个月,我可以根据需要扩展它。

1 个答案:

答案 0 :(得分:0)

我将查询包装在另一个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

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