Sql server 如果SQL Server中的另一列不存在值,则按日期的季度获取行和和组的计数
我有一些样本数据:Sql server 如果SQL Server中的另一列不存在值,则按日期的季度获取行和和组的计数,sql-server,group-by,Sql Server,Group By,我有一些样本数据: Date Status OfferNum Amount ------------------------------------------------------ 2016/10/30 - 1 - 2000 - 1000,00 2016/08/25 - 0 - 2000 - 1100,00 2016/07/12 - 0
Date Status OfferNum Amount
------------------------------------------------------
2016/10/30 - 1 - 2000 - 1000,00
2016/08/25 - 0 - 2000 - 1100,00
2016/07/12 - 0 - 2001 - 1200,00
2016/08/30 - 0 - 2001 - 1300,00
2016/07/12 - 1 - 2002 - 1400,00
2016/08/30 - 1 - 2002 - 1500,00
2016/08/30 - 1 - 2003 - 1600,00
我不想计算offerNum状态值中的一个是否有1且在同一季度(如果有1但不是同一季度,则必须进行计数)。但我想把所有的金额加起来(这不取决于状态列)
以下是我想要的结果:
Quarter Count TotalAmount
----------------------------------------------------
2016/Q3 2 (offerNum 2002 and 2003) 8100,00
2016/Q4 1 (offerNum 2000) 1000,00
以下是SQLFIDLE:您可以使用子查询计算每个
报价的状态,然后计算按季度汇总的最终结果。请注意,按
年分组很重要,否则结果将包含来自前几年同一季度的数据
--
-- Answer updated according to SQL Fiddle.
-- Check: http://sqlfiddle.com/#!6/709ff/9
--
WITH offers AS
(
SELECT
CONCAT(DATEPART(yy, date), '/Q', DATEPART(qq, date)) AS Quarter,
offer,
MAX(status) AS status,
SUM(amount) AS TotalAmount
FROM temp
GROUP BY
DATEPART(yy, date),
DATEPART(qq, date),
offer
)
SELECT
Quarter,
SUM(status) AS Count,
SUM(TotalAmount) AS TotalAmount
FROM offers
GROUP BY Quarter
您是否为此锁定:
SELECT
CONCAT(DATEPART(yy, [date]), '/Q', DATEPART(qq, [date])) AS Quarter,
COUNT(case [status] when 1 THEN 1 ELSE NULL END) AS [Count],
SUM([Amount]) AS TotalAmount
FROM [dbo].[temp]
group by DATEPART(yy, [date]), DATEPART(qq, [date])
您可以这样查询
;WITH cte
AS (SELECT
concat(YEAR(date), '/Q', DATEPART(q, date)) AS q,
amount,
SUM(status) OVER (PARTITION BY concat(YEAR(date), '/Q', DATEPART(q, date))) AS OfferStatusSum,
status
FROM temp)
SELECT
q, COUNT(DISTINCT status),
SUM(CASE WHEN OfferStatusSum >= 1 THEN amount
ELSE 0
END)
FROM cte
GROUP BY q
我编辑。现在清楚了。但在代码中,总和(status)计算所有状态。我只想要1,如果有两个或两个以上在同一个offernumi如果你改变总和(durum)作为计数计数(不同的durum)作为[计数],我猜你得到你想要的。不。它在每个offerNum中计算1和0值。如果这些1重复一次或两次以上,那么在VedatKaraağaç,你是受欢迎的。快乐编码,我刚刚更新了你的帖子。加上2002年和2003年的offernum,你怎么会得到8100?这都是2016/Q3季度的金额,不仅仅是2002年和2003年。你仍然得到8000美元?如何8100?我在你的小提琴坏,你提供了最后一个值为1500,所以它是8000,可能复制粘贴错误你的例子没有提供负面的测试用例,你可以添加该值,以及?我只想状态列1的计数。但如果这些1重复一次或两次以上,则计数为1。在您的代码中,它在每个函数中计算1和0个值(感谢黄敏聪提供了正确的datepart子句…;)您错过了计数值?:)添加了计数以及更新的代码,您可以修改:)