Sql 在where子句中添加子条件
我不确定where子句中对该条件的正确名称。我正在使用Microsoft SQL Server 2008 基本上,我有一个包含以下列的订单表 MyOrderTable:Sql 在where子句中添加子条件,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我不确定where子句中对该条件的正确名称。我正在使用Microsoft SQL Server 2008 基本上,我有一个包含以下列的订单表 MyOrderTable: OrderAmount Paid OrderDate 100 Y 2016-08-10 21:15:52.000 120 N 2016-08-10 20:15:12.000 300 Y 2016-08-09 11:10:22.000 500
OrderAmount Paid OrderDate
100 Y 2016-08-10 21:15:52.000
120 N 2016-08-10 20:15:12.000
300 Y 2016-08-09 11:10:22.000
500 Y 2016-06-09 10:10:54.000
125 N 2016-06-09 09:15:13.000
325 N 2015-11-09 09:15:13.000
目前,我有以下SQL查询:
SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth,
SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount
FROM MyOrderTable
WHERE YEAR(OrderDate) = 2016
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate)
ORDER BY TheYear, TheMonth
上述SQL返回的结果如下所示:
TheYear TheMonth SumOrderAmount
2016 6 625
2016 8 520
我如何查询行付款的SumOrderAmount='Y'?我想从SQL返回以下内容:
TheYear TheMonth SumOrderAmount PaidSumOrderAmount
2016 6 625 500
2016 8 520 400
我该怎么做?非常感谢您的帮助。谢谢。使用
大小写
表达式执行有条件的求和()
:
使用
case
表达式执行条件SUM()
:
使用条件聚合:
SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth,
SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount,
SUM(CASE WHEN Paid = 'Y' THEN OrderAmount ELSE 0 END) as PaidOrderAmount
FROM MyOrderTable
WHERE YEAR(OrderDate) = 2016
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate)
ORDER BY TheYear, TheMonth;
您可能不需要
SUM()
中的ISNULL()。在SQL中,SUM()聚合函数中的NULL
值被忽略。使用条件聚合:
SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth,
SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount,
SUM(CASE WHEN Paid = 'Y' THEN OrderAmount ELSE 0 END) as PaidOrderAmount
FROM MyOrderTable
WHERE YEAR(OrderDate) = 2016
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate)
ORDER BY TheYear, TheMonth;
您可能不需要SUM()
中的ISNULL()。在SQL中,SUM()聚合函数中的NULL
值被忽略。在select上添加此子句:
SUM(CASE WHEN Paid='Y' THEN OrderAmount ELSE 0 END) AS PaidSumOrderAmount
在select上添加此子句:
SUM(CASE WHEN Paid='Y' THEN OrderAmount ELSE 0 END) AS PaidSumOrderAmount
所以说了之后,他也不需要ELSE 0
:)@sagi。相反。当没有匹配项时,需要防止NULL
值,因为假设一个月没有支付金额是合理的。另一方面,如果一个月的所有已付金额都是NULL
,那么总数也需要它。考虑到提供的数据,这似乎不太可能。如果OP有几个月没有付费销售,这可能比空值(而不是0)更大。这正是我要找的。非常感谢你的帮助。不管怎样,为什么我的问题会得到-1分呢?这么说之后,他也不需要ELSE 0
:)@sagi。相反。当没有匹配项时,需要防止NULL
值,因为假设一个月没有支付金额是合理的。另一方面,如果一个月的所有已付金额都是NULL
,那么总数也需要它。考虑到提供的数据,这似乎不太可能。如果OP有几个月没有付费销售,这可能比空值(而不是0)更大。这正是我要找的。非常感谢你的帮助。不管怎样,为什么我的问题会得到-1?请注意OP希望保持SumOrderAmount列与以前一样。@jarlh抱歉,我不懂英语verrywell@jarlh你的答案和Gordon Linoff是sameI,我也注意到了,但这次我打字快了一点@jarlh很抱歉,兄弟,这件事在我身上发生过很多次。我非常生气,有些人因为我的母语而不尊重我,并且给我带来了问题,我没有任何朋友,也没有与任何人交谈。请注意,OP希望保持SumOrderAmount列与以前一样。@jarlh抱歉,我不太懂英语well@jarlh你的答案和Gordon Linoff是sameI,我也注意到了,但这次我打字快了一点@我非常生气,有些人因为我的母语而不尊重我,给我带来了麻烦,我没有任何朋友,也没有和任何人说话。