我正在尝试使用与我的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
如果我从A.
删除group by A.item_id
前缀,我会收到同样的错误。
如果我注释掉group by
子句,查询将执行并返回一个带有item_id的表和一列销售的一列,但item_id行仍然重复(看起来甚至更多次)。这对我来说似乎很奇怪,因为我认为每个不在聚合函数中的列都需要在group by
子句中,否则它应该抛出错误。
如何修复此查询以使其正确旋转并将每个item_id的数量相加?如果我可以让它工作一个月,我可以根据需要扩展它。
答案 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
这符合我的期望,但如果有人可以提供没有这个的答案,或者解释为什么有必要的答案,我会接受这个答案。