Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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 按日期计算的金额_Sql_Sql Server_Ssms - Fatal编程技术网

Sql 按日期计算的金额

Sql 按日期计算的金额,sql,sql-server,ssms,Sql,Sql Server,Ssms,我目前有一个代码,我想根据年份对每个数量求和。我已经编写了一个代码,我认为该代码将计算2016年和2017年的所有费用,但它运行不正确 我添加了两种不同类型的分区by语句,以测试其中一种是否有效。当我把它们拿出来的时候,年度栏只会显示特定收据的数量 这是我目前的代码: SELECT ReceiptNumber ,Quantity ,Date ,sum(CASE WHEN (Date >= '2016-01-01' and Date < '2017-01-01') T

我目前有一个代码,我想根据年份对每个数量求和。我已经编写了一个代码,我认为该代码将计算2016年和2017年的所有费用,但它运行不正确

我添加了两种不同类型的
分区by
语句,以测试其中一种是否有效。当我把它们拿出来的时候,年度栏只会显示特定收据的数量

这是我目前的代码:

SELECT 
  ReceiptNumber
  ,Quantity
  ,Date
  ,sum(CASE WHEN (Date >= '2016-01-01' and Date < '2017-01-01') THEN 
        Quantity 
        ELSE 0 END)
        OVER (PARTITION BY Date) 
        as Annual2016
  ,sum(CASE WHEN (Date >= '2017-01-01' and Date < '2018-01-01') THEN 
        Quantity 
        ELSE 0 END) 
        OVER (PARTITION BY ReceiptNumber)
        as Annual2017
FROM Table1
GROUP BY ReceiptNumber, Quantity, Date
以下是我从中提取的一些数据示例:

ReceiptNumber    Quantity    Date           
1                5           2016-01-05
2                11          2017-04-03
3                12          2016-11-11
4                2           2017-09-09
5                96          2015-07-08
6                15          2016-12-12
7                24          2016-04-19
8                31          2017-01-02
9                10          2017-0404
10               18          2015-10-10
11               56          2017-06-02

试试这样的

ReceiptNumber    Quantity    Date           Annual2016    Annual2017
1                5           2016-01-05     17            13
2                11          2017-04-03     17            13
3                12          2016-11-11     17            13
4                2           2017-09-09     17            13
Select 
..
sum(CASE WHEN (Date >= '2016-01-01' and Date < '2017-01-01') THEN 
        Quantity 
        ELSE 0 END)
        OVER () as Annual2016
sum(CASE WHEN (Date >= '2017-01-01' and Date < '2018-01-01') THEN 
        Quantity 
        ELSE 0 END)
        OVER ()as Annual2017
.. 
Where Date >= '2016-01-01' and Date < '2018-01-01'
选择
..
金额(如果(日期>='2016-01-01'和日期<'2017-01-01'),则
量
(完)
2016年全年超过()
金额(如果(日期>='2017-01-01'和日期<'2018-01-01'),则
量
(完)
2017年全年超过()
.. 
其中日期>='2016-01-01'和日期<'2018-01-01'

试试这样的方法

ReceiptNumber    Quantity    Date           Annual2016    Annual2017
1                5           2016-01-05     17            13
2                11          2017-04-03     17            13
3                12          2016-11-11     17            13
4                2           2017-09-09     17            13
Select 
..
sum(CASE WHEN (Date >= '2016-01-01' and Date < '2017-01-01') THEN 
        Quantity 
        ELSE 0 END)
        OVER () as Annual2016
sum(CASE WHEN (Date >= '2017-01-01' and Date < '2018-01-01') THEN 
        Quantity 
        ELSE 0 END)
        OVER ()as Annual2017
.. 
Where Date >= '2016-01-01' and Date < '2018-01-01'
选择
..
金额(如果(日期>='2016-01-01'和日期<'2017-01-01'),则
量
(完)
2016年全年超过()
金额(如果(日期>='2017-01-01'和日期<'2018-01-01'),则
量
(完)
2017年全年超过()
.. 
其中日期>='2016-01-01'和日期<'2018-01-01'
您需要对窗口聚合进行一些条件聚合。只需按删除这两个
分区,因为您已经在筛选本例中的年份:

SELECT 
  ReceiptNumber
  ,Quantity
  ,Date
  ,sum(CASE WHEN (Date >= '2016-01-01' and Date < '2017-01-01') THEN 
        Quantity 
        ELSE 0 END)
        OVER () as Annual2016
  ,sum(CASE WHEN (Date >= '2017-01-01' and Date < '2018-01-01') THEN 
        Quantity 
        ELSE 0 END) 
        OVER () as Annual2017
FROM Table1
选择
收据号码
量
,日期
,总和(日期>='2016-01-01'和日期<'2017-01-01'),然后
量
(完)
2016年全年超过()
,总和(日期>='2017-01-01'和日期<'2018-01-01'),然后
量
(完)
2017年全年超过()
来自表1
您可能不需要按收件编号、数量、日期对最终的
分组

您需要对窗口聚合进行一些条件聚合。只需按
删除这两个
分区,因为您已经在筛选本例中的年份:

SELECT 
  ReceiptNumber
  ,Quantity
  ,Date
  ,sum(CASE WHEN (Date >= '2016-01-01' and Date < '2017-01-01') THEN 
        Quantity 
        ELSE 0 END)
        OVER () as Annual2016
  ,sum(CASE WHEN (Date >= '2017-01-01' and Date < '2018-01-01') THEN 
        Quantity 
        ELSE 0 END) 
        OVER () as Annual2017
FROM Table1
选择
收据号码
量
,日期
,总和(日期>='2016-01-01'和日期<'2017-01-01'),然后
量
(完)
2016年全年超过()
,总和(日期>='2017-01-01'和日期<'2018-01-01'),然后
量
(完)
2017年全年超过()
来自表1

您可能不需要按收货编号、数量、日期对最终的
分组

如果希望只在顶部打印一次,则应在单独的查询中运行它,如:

SELECT YEAR(Date) y, sum(Quantity) s FROM Table1 GROUP BY YEAR(Date)
然后执行如下主查询:

SELECT * FROM table1
放松点,皮西…;-)

您最初的问题也可以用以下方式回答:

SELECT *, 
 (SELECT SUM(Quantity) FROM Table1 WHERE YEAR(Date)=2016 ) Annual2016,
 (SELECT SUM(Quantity) FROM Table1 WHERE YEAR(Date)=2017 ) Annual2017
FROM table1

如果希望只在顶部打印一次,则应在单独的查询中运行,如:

SELECT YEAR(Date) y, sum(Quantity) s FROM Table1 GROUP BY YEAR(Date)
然后执行如下主查询:

SELECT * FROM table1
放松点,皮西…;-)

您最初的问题也可以用以下方式回答:

SELECT *, 
 (SELECT SUM(Quantity) FROM Table1 WHERE YEAR(Date)=2016 ) Annual2016,
 (SELECT SUM(Quantity) FROM Table1 WHERE YEAR(Date)=2017 ) Annual2017
FROM table1

您可以添加一些数据样本吗?使用临时表或测试数据的值删除分区。i、 e.
OVER()
,您已经在筛选本案例中的年份)我已经在我的问题中添加了示例数据@dnoeth我刚刚测试过,当我这样做时,它只是在适当的列中打印数量(2016年与2017年),但它不会将该年的所有数量相加。不要删除
超过
,只有
分区依据…
。您可以添加一些数据样本吗?使用测试数据的临时表或值删除这两个
分区依据
。i、 e.
OVER()
,您已经在筛选本案例中的年份)我已经在我的问题中添加了示例数据@dnoeth我刚刚测试过,当我这样做时,它只是在适当的列中打印数量(2016年与2017年),但它不会将当年的所有数量相加。不要删除
上的
,只删除
分区…
。这非常有效。有没有办法让它只在最上面打印一次?@nola94这不是SQL Server的工作,您可以在应用程序中管理它。我通常使用两个模型和两个存储过程来实现这一点。一个用于返回数据,一个用于返回计数。将这两个模型组合成一个viewmodel,您就拥有了所需的一切。可爱的东西。@nola94-如上所述。虽然这在sql中是可以实现的,但必须在应用层完成。这非常有效。有没有办法让它只在最上面打印一次?@nola94这不是SQL Server的工作,您可以在应用程序中管理它。我通常使用两个模型和两个存储过程来实现这一点。一个用于返回数据,一个用于返回计数。将这两个模型组合成一个viewmodel,您就拥有了所需的一切。可爱的东西。@nola94-如上所述。虽然在sql中可以实现,但必须在应用层实现。。