如何将连接嵌套到复杂的选择总和中(case,group by statement

时间:2017-02-23 00:29:45

标签: sql case

我正在尝试生成一个报告,到目前为止已经完成了一个报告,它给了我每天有多少订单处于状态1-9。

TableA结构如下所示:

Sales Order | Order Status | Order Date
123456789 | 1 | 2017-02-22 00:00:00.000
123456790 | 0 | 2017-02-21 00:00:00.000

TableB结构如下所示:

Sales Order | Price
123456789 | 123.00
123456789 | 42.00
123456790 | 56.00
123456790 | 28.00

此代码:

SELECT
    MAX(year([OrderDate])) as Yr,
    MAX(MONTH([OrderDate])) as M,
    Day([OrderDate]) as Day, 
    sum(case when [OrderStatus]='0' THEN 1 ELSE 0 END) AS 'STATUS"0"',
    sum(case when [OrderStatus]='1' THEN 1 ELSE 0 END) AS 'STATUS"1"',
    sum(case when [OrderStatus]='2' THEN 1 ELSE 0 END) AS 'STATUS"2"',
    sum(case when [OrderStatus]='4' THEN 1 ELSE 0 END) AS 'STATUS"4"',
    sum(case when [OrderStatus]='8' THEN 1 ELSE 0 END) AS 'STATUS"8"',
    sum(case when [OrderStatus]='9' THEN 1 ELSE 0 END) AS 'STATUS"9"',
    sum(case when [OrderStatus]='S' THEN 1 ELSE 0 END) AS 'STATUS"S"',
    sum(case when [OrderStatus]='*' THEN 1 ELSE 0 END) AS 'STATUS"*"',
    sum(case when [OrderStatus]='/' THEN 1 ELSE 0 END) AS 'STATUS"/"'
FROM 
    SorMaster  
WHERE 
    YEAR([OrderDate]) = YEAR(GETDATE())
GROUP BY
    DATENAME(month, DateAdd(month, Month([OrderDate]) - 1, Cast('2008-01-01' AS Datetime))), Day([OrderDate]) 
ORDER BY
    Yr DESC, M DESC, Day DESC

返回:

Yr | M | Day | STATUS"0" | STATUS"1" | STATUS"2" | STATUS"4" | STATUS"8" | STATUS"9" | STATUS"S" | STATUS"*" | STATUS"/"
2017    2   22  0   2   0   1   0   0   5   0   0
2017    2   21  0   0   0   7   0   0   0   0   0

这对我的第一份报告来说是完美的。

现在,麻烦来了。我的问题是我需要对表B进行嵌套查询,这样我就不需要返回一个计数(订单),而是需要总和(订单)每个订单的总数在表B中。

使用上面的示例,查询需要返回如下内容:

Yr | M | Day | STATUS"0" | STATUS"1" | STATUS"2" | STATUS"4" | STATUS"8" | STATUS"9" | STATUS"S" | STATUS"*" | STATUS"/"
2017    2   22  0   165 0   0   0   0   0   0   0
2017    2   21  84  0   0   0   0   0   0   0   0

任何指针?

3 个答案:

答案 0 :(得分:1)

加入var getTabIds = function getTabIds(result) { if (result.success) { //var returnObject = new Array(); var returnObject = new Object(); for (i = 0; i < result.ids.length; i++) { sforce.console.getSubtabIds(result.ids[i], function (subTabResult) { if (subTabResult.success) { for (i = 0; i < subTabResult.ids.length; i++) { var subTabId = subTabResult.ids[i]; sforce.console.getPageInfo(subTabId, function (page) { var subTabInfo = jQuery.parseJSON(page.pageInfo); var id = subTabInfo.objectId.toString(); returnObject[id] = subTabInfo; Object.defineProperty(returnObject, id, { enumerable: true }); //returnObject.push(page.pageInfo); }); } console.log("returnObject", returnObject); var returnString = JSON.stringify(returnObject); console.log("returnString", returnString); console.log("keys", Object.keys(returnObject)); console.log(Object.getOwnPropertyNames(returnObject), returnObject["001N0000016Shzx"]) $Lightning.use("c:LO_InteractionLogApp", function() { $Lightning.createComponent("c:LO_InteractionLogComponent", null, "lightning", function(cmp) { var myExternalEvent; myExternalEvent = $A.get("e.c:InteractionLogRelatedRecordsResponse"); myExternalEvent.setParams({ "response": returnString }); myExternalEvent.fire(); }); }); } }); } } };

TableB

答案 1 :(得分:1)

这不是太困难,只是表B中的LEFT JOIN,然后将价格汇总在一起。这里有几个小技巧。您希望LEFT JOIN以确保表A中的行始终显示,即使表B中没有相应的行。其次,在SUM()语句中,您需要添加{{1确保您对小数进行求和,并且COALESCE(...,0.00)没有NULL值。奇怪的是,数据库LEFT JOIN

对于以下查询,您需要将NULL + {anything} = NULL的名称更改为表名称,并且TableB谓词需要准确命名列名称,并且如果它们包含空格则正确分隔。例如,在MSSQL中,分隔符为JOIN[,例如]

MyTable.[My Column With Spaces]

答案 2 :(得分:0)

通过(左)加入tableB并替换你的&#39;计数&#39;通过tableB.price,你应该获得具有相应状态的所有订单头寸的总和。