Sql 按日期计算的金额
我目前有一个代码,我想根据年份对每个数量求和。我已经编写了一个代码,我认为该代码将计算2016年和2017年的所有费用,但它运行不正确 我添加了两种不同类型的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
分区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中可以实现,但必须在应用层实现。。