Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 合计Select Case语句中的聚合_Sql Server 2008 - Fatal编程技术网

Sql server 2008 合计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 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
           ) 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的总和。解决了-谢谢戈登-顶部正是我想要做的。也请非常感谢你的帮助。这群人太棒了!