Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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_Count_Group By_Window Functions - Fatal编程技术网

分区上的SQL计数,然后按月分组

分区上的SQL计数,然后按月分组,sql,sql-server,count,group-by,window-functions,Sql,Sql Server,Count,Group By,Window Functions,我一直在玩弄如何使用COUNTvalue对另一个值进行分区,我喜欢它从我的db中提取结果的速度。我现在正在努力提高工作效率,这样我就可以创建一个表,显示多个计数——每个月一个,并排显示。我不确定这是否可行,但想在这里查一下。我在网上浏览了一下,但找不到以前有人问过这个问题的任何例子,所以没有线索 以下是我目前拥有的: SELECT DISTINCT TBL.CATEGORY as 'Category Name', COUNT(TBL.ROW_ID) OVER (PARTITION BY TBL.

我一直在玩弄如何使用COUNTvalue对另一个值进行分区,我喜欢它从我的db中提取结果的速度。我现在正在努力提高工作效率,这样我就可以创建一个表,显示多个计数——每个月一个,并排显示。我不确定这是否可行,但想在这里查一下。我在网上浏览了一下,但找不到以前有人问过这个问题的任何例子,所以没有线索

以下是我目前拥有的:

SELECT DISTINCT
TBL.CATEGORY as 'Category Name',
COUNT(TBL.ROW_ID) OVER (PARTITION BY TBL.CATEGORY) as 'Rows in Category'
FROM
MYDB.TBL
WHERE
TBL.FIELD1 = 'something'
AND TBL.FIELD2 = 'somethingelse'
AND TBL.CREATED >= '2014-01-01'
ORDER BY [Rows in Category] desc
给了我一张这样可爱的桌子:

Category Name |Rows in Category
 ABC          | 166
 CBA          | 137
 CCC          | 112
我现在要做的是按月份细分,这样我的输出结果看起来就像这样,不必精确,标题可以随意移动:

JANUARY                          |FEBRUARY
 Category Name |Rows in Category | Category Name |Rows in Category 
  ABC          | 162             |  CBA          | 51
  CBA          | 86              |  CCC          | 32               
  CCC          | 70              |  ABC          | 4
当我尝试添加GROUP BY时,它会抛出一个错误,即聚合函数中不包含某些内容

如果必须的话,我可以将查询堆叠在一起,并将每个查询限制为仅显示一个月,但这似乎需要大量重复代码,如果可以的话,我更喜欢并行视图


有什么想法吗?

格式将与您描述的不完全相同。但这是显示结果的正常方式,并且所有信息都已包含在内,请确保一次显示的时间不超过1年

试试这个:

;WITH x AS
(
   SELECT TBL.CATEGORY, TBL.ROW_ID, datename(month, TBL.CREATED) month
   FROM
      MYDB.TBL
   WHERE
      TBL.FIELD1 = 'something'
      AND TBL.FIELD2 = 'somethingelse'
      AND TBL.CREATED >= '2014-01-01'
      AND TBL.CREATED < '2015-01-01'
)
SELECT CATEGORY as 'Category Name', [January],[February]
FROM x
   PIVOT(
      count([ROW_ID])  
      FOR month
      in([January],[February])  
   )AS p

@谢谢你在这方面的帮助。我以前没有使用过coalesce,所以今天我学到了一些有用的东西。最后,因为我发现我需要一个总计列,所以我添加了一个YTD列,并能够按此进行排序

想要发布最终结果,以防对其他人有用:

WITH X AS

(
SELECT 
tbl.category,
tbl.row_id,
DATENAME(MONTH, tbl.created) MONTH,
COUNT(tbl.row_id) OVER (PARTITION BY tbl.category) AS 'YTD'
FROM
db.tbl
WHERE
tbl.randomcolumn = 'something specific'
AND tbl.anothercolumn = 'something else specific'
AND created >= '2014-01-01'
AND created < '2015-01-01'
)

SELECT
category AS 'Category Name',
[January], [February], [March], [April], [May], [June], [July], [August], [September], [October], [November], [December],
[YTD]
FROM X

   PIVOT
   (COUNT([row_id]) 
   FOR MONTH
   in([January], [February], [March], [April], [May], [June], [July], [August], [September], [October], [November], [December])
   )AS P

ORDER BY [YTD] DESC

如果希望重新调整此查询的用途,请将您自己的db/表中等价项的小写部分切掉。

理想!这就成功了。有没有办法按总计数降序对类别进行排序?@joe在脚本末尾添加了“按类别排序”这似乎是按类别名称的字母顺序排序的,我希望先按计数排序。但是别担心,我已经对结果很满意了。@joe你也可以通过coalesce[一月]+coalesce[二月]来写订单