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子句…;)您错过了计数值?:)添加了计数以及更新的代码,您可以修改:)