如何聚合复杂sql报告的销售数据

时间:2016-07-17 13:07:27

标签: sql sql-server excel report sales

我习惯于编写简单的SQL查询,然后在Excel中创建报表,但是在这种情况下,数据太大而无法在Excel中建模,但我不确定如何处理SQL解决方案。

我有一个表(我可以完全访问此表但不能访问数据库,即我无法添加更多表)。该表包含大约500个不同帐户的交易,很多em。我需要做的是创建一个报告,提供一个帐户,然后逐行购买每个产品。以最大帐户到最小帐户的顺序。

我可以通过销售获得帐户列表:

lvlObjects = [];
lvlObject = {};
lvlObject.level = 1;
lvlObject.leftWordList = true;
lvlObject.previewViewRight = true;
....
lvlObjects.push(lvlObject);
//same for more levels.
//then call to a function that fill the scope with current values:
function updateLevel(currentLevel) {
    $scope.level = lvlObjects[currentLevel-1].level; //if needed
    $scope.leftWordList = lvlObjects[currentLevel-1].leftWordList;
    ....
}

但不确定如何获得所有500个帐户的第一个帐户,然后是产品总数,然后是第二个帐户,产品总数等。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

尝试使用带有窗口函数的CTE(公用表表达式)(即windowfunc(列)over(按列分区)。有些事情就像。

;WITH accountTotals (acctId, prodId, acctTotal, ProdTotal)
AS (
    SELECT AccountId, ProducatID,  Sum(Sales) over (Partition By AccountID) as AccountTotal, Sum(Sales) over (Partiton by AccountId, ProductID) as ProdTotal
    Where TransDate >= @inclusiveStart and TransDate < @exclusiveEnd
)
SELECT Distinct AcctID, ProdID, ProdTotal from accountTotals
ORDER BY  acctTotal, acctId, prodId

由于您提到Excel,我假设SQL Server。 CTE也可以在Oracle中使用,但不能在MySQL中使用(请尝试使用相关的子查询)。

不要在两者之间使用日期。使用半开区间的显式比较(即上限为+1,比较严格小于)