我如何使用Count在每个月找到品牌

时间:2016-09-30 10:31:46

标签: sql sql-server

我有一个表,其中所有列都具有数据类型VARCHAR(MAX)。

是否可以分析我拥有日期和品牌的数据,对其进行分组,删除重复项,然后使用计数来查找每个月找到的品牌数量。

为您提供简单的视觉解释(真实数据很大)......

Date               Brand
2012-11-12T16:30   SamSung   
2012-16-11T12:20   Sony
2012-16-12T09:30   Samsung
2012-16-11T10:00   Sony

输出我想看

Date      Brand     TotalCount
12-2012   Samsung   2 
11-2012   Sony      2

我尝试使用以下它需要很长时间,然后我不知道结合计数。我知道如何使用Count与组,但我不确定是否应该使用Group By。

SELECT CONVERT(char(8), SomeDate, 4),Brand from SomeTable group by   
SomeDate, Brand

然后我尝试了以下但我不知道如何结合Brand和使用Count ...

SELECT monthYear FROM (
SELECT DISTINCT DATENAME(month,SomeDate) + ' ' + 
CONVERT(VARCHAR, DATEPART(year,SomeDate)) monthYear, 
CONVERT(varchar(8),SomeDate, 4) orderCol
FROM SomeTable) A
ORDER BY CONVERT(INT,orderCol) desc

我收到错误,我相信它是因为SomeDate列中有T ...

Conversion failed when converting the varchar value '2012-11-16' to data type int

我正在使用SQL Server 2014.

谢谢,如果有人可以帮助我

3 个答案:

答案 0 :(得分:1)

我同意@Gordon您必须始终使用特定数据类型来存储数据,特别是日期,因为它的文化表现不同

;WITH T AS
(
    SELECT 
        LEFT(Date,4) AS 'Year', 
        LEFT(REPLACE(Date,LEFT(Date,8),''),2) AS 'Month',
        Brand
    FROM @tblTest
)
SELECT
    T.[Month]+'-'+T.[Year] AS 'Date',
    T.Brand,
    COUNT(Brand) AS TotalCount
FROM T
GROUP BY T.Brand,T.[Year],T.[Month]

<强>输出:

enter image description here

答案 1 :(得分:1)

尝试以下非常简单的查询来获取您需要的结果。

select 
    convert(varchar,DATEPART(m,date))+'-'+convert(varchar,DATEPART(yyyy,date))  as [Date],Brand,count(brand) as Total
from temp
group by brand,DATEPART(m,date),DATEPART(yyyy,date)

答案 2 :(得分:0)

如您所知,在varchar(max)中存储数据并不是一个好主意。您应该使用内置数据类型,尤其是数字和日期。

在任何情况下,月份只是日期列的左侧7个字符,所以:

select left(somedate, 7) as yyyymm, brand, count(*)
from someTable
group by left(somedate, 7), brand;