Sql server 2008 合计Select Case语句中的聚合
是否有办法从每个select case语句中的聚合中获取总计?下面通过在一列中列出每个月的总数,为我提供了正确的总数,但我希望每个案例陈述都有一个单独的总数Sql server 2008 合计Select Case语句中的聚合,sql-server-2008,Sql Server 2008,是否有办法从每个select case语句中的聚合中获取总计?下面通过在一列中列出每个月的总数,为我提供了正确的总数,但我希望每个案例陈述都有一个单独的总数 SELECT SUM( CASE WHEN dbo.bill_t_ARTransaction.TransactionDate BETWEEN '2000-01-01' AND '2016-12-31' THEN dbo.bill_t_ARTransaction.Amount ELSE 0 END
SELECT SUM(
CASE WHEN dbo.bill_t_ARTransaction.TransactionDate BETWEEN '2000-01-01' AND '2016-12-31' THEN dbo.bill_t_ARTransaction.Amount ELSE 0 END
) AS 'Dec16'
, SUM(
CASE WHEN dbo.bill_t_ARTransaction.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31' THEN dbo.bill_t_ARTransaction.Amount ELSE 0 END
) AS 'JAN17'
FROM dbo.bill_t_ARTransaction
INNER JOIN dbo.bill_t_TripTicket ON (
dbo.bill_t_ARTransaction.RunNumber = dbo.bill_t_TripTicket.RunNumber
)
INNER JOIN dbo.med_m_Company ON (
dbo.bill_t_TripTicket.CompanyCode = dbo.med_m_Company.CompanyCode
)
WHERE dbo.bill_t_TripTicket.CompanyCode = '105'
AND dbo.bill_t_ARTransaction.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31'
GROUP BY dbo.bill_t_ARTransaction.TransactionDate
我刚刚格式化了您的SQL,这样对人类来说更可读,并将其放入子选择中
在外部选择中,我刚刚添加了两个计算列的总和
SELECT sums.*
,SUM(sums.DEC16 + sums.JAN17) AS TOTAL_SUM
FROM (
SELECT SUM( CASE WHEN dbo.bill_t_ARTransaction.TransactionDate
BETWEEN '2000-01-01'
AND '2016-12-31'
THEN dbo.bill_t_ARTransaction.Amount
ELSE 0
END
) AS DEC16
,SUM( CASE WHEN dbo.bill_t_ARTransaction.TransactionDate
BETWEEN '2000-01-01'
AND '2017-01-31'
THEN dbo.bill_t_ARTransaction.Amount
ELSE 0
END
) AS JAN17
FROM dbo.bill_t_ARTransaction
INNER JOIN dbo.bill_t_TripTicket
ON dbo.bill_t_ARTransaction.RunNumber = dbo.bill_t_TripTicket.RunNumber
INNER JOIN dbo.med_m_Company
ON dbo.bill_t_TripTicket.CompanyCode = dbo.med_m_Company.CompanyCode
WHERE dbo.bill_t_TripTicket.CompanyCode = '105'
AND dbo.bill_t_ARTransaction.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31'
GROUP BY dbo.bill_t_ARTransaction.TransactionDate
) sums
您可以这样做:
SELECT DATENAME(MONTH, Transaction.TransactionDate) + RIGHT(YEAR(Transaction.TransactionDate), 2) AS MonthYear
, SUM(Transaction.Amount) AS Amount
FROM dbo.bill_t_ARTransaction Transaction
INNER JOIN dbo.bill_t_TripTicket Ticket
ON Transaction.RunNumber = Ticket.RunNumber
INNER JOIN dbo.med_m_Company Company
ON Ticket.CompanyCode = Company.CompanyCode
WHERE Ticket.CompanyCode = '105'
AND Transaction.TransactionDate >= '2000-01-01'
AND Transaction.TransactionDate < '2017-02-01'
GROUP BY DATENAME(MONTH, Transaction.TransactionDate) + RIGHT(YEAR(Transaction.TransactionDate), 2)
选择DATENAME(月,事务处理.事务处理日期)+右(年,事务处理.事务处理日期),2)作为MonthYear
,金额(交易记录金额)为金额
来自dbo.bill\u t\u艺术品交易
内部连接dbo.bill\u t\u TripTicket票据
ON Transaction.RunNumber=Ticket.RunNumber
内部加入dbo.med_m_公司
ON Ticket.CompanyCode=Company.CompanyCode
其中Ticket.CompanyCode='105'
和Transaction.Transaction日期>='2000-01-01'
交易日期<'2017-02-01'
按日期分组名称(月,事务处理。事务处理日期)+权利(年,事务处理。事务处理日期),2)
假设
dbo.bill\u t\u ARTransaction.TransactionDate
是一个datetime(2)
:您是否知道在'DEC16'中,您缺少来自(例如)2016-12-31 11:00:00
的交易<“代码>介于之间”包含在两侧,如果未定义时间组件,则日期默认为午夜(00:00:00)。我相应地修改了WHERE
子句。我还添加了别名以提高可读性。我想您只是想通过获得组的正确位置:
SELECT SUM(CASE WHEN ba.TransactionDate BETWEEN '2000-01-01' AND '2016-12-31'
THEN ba.Amount ELSE 0
END) AS Dec16,
SUM(CASE WHEN ba.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31'
THEN ba.Amount ELSE 0
END) AS JAN17
FROM dbo.bill_t_ARTransaction ba INNER JOIN
dbo.bill_t_TripTicket bt
ON ba.RunNumber = bt.RunNumber INNER JOIN
dbo.med_m_Company c
ON bt.CompanyCode = c.CompanyCode
WHERE bt.CompanyCode = '105' AND
ba.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31';
请注意我对查询所做的其他更改:
- 我从列别名中删除了单引号。单引号只能用于字符串和日期值(允许将它们用于列别名,但可能会导致混淆)
- 这些表都有别名
- 列名用别名限定(查询更易于编写和读取)
- 请注意,如果
CompanyCode
是数字,则'105'
不应带有引号
我认为查询可以简化为:
SELECT SUM(CASE WHEN ba.TransactionDate BETWEEN '2000-01-01' AND '2016-12-31'
THEN ba.Amount ELSE 0
END) AS Dec16,
SUM(CASE WHEN ba.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31'
THEN ba.Amount ELSE 0
END) AS JAN17
FROM dbo.bill_t_ARTransaction ba INNER JOIN
dbo.bill_t_TripTicket bt
ON ba.RunNumber = bt.RunNumber
WHERE bt.CompanyCode = 105 AND
ba.TransactionDate BETWEEN '2000-01-01' AND '2017-01-31';
Company
表似乎未被使用。因此您希望在12月16日和1月17日之前进行分组?(1)用您正在使用的数据库标记您的问题。(2)显示您在hte结果中使用的格式。正确-我想要2016年12月的单个总计,然后是2017年1月的总计。随着会计年度的进展,每个月我都希望下一列包含之前的所有内容,并将当前月份添加到总计中。谢谢Gordon,我没有看到我的标签中有选择。所以您想要月份和running 12月16日和1月17日的合计?很抱歉。我想我还不够清楚。Esteban您的查询每月都会合计(在我为合计添加了group by子句之后)。在日期范围内,每一行是每月的12月+1月。我想有一个单一的总和。12月16日是2000-01-01到2016-12-31的总和,然后1月17日是2000-01-01到2017-01-31的总和。解决了-谢谢戈登-顶部正是我想要做的。也请非常感谢你的帮助。这群人太棒了!