2015-04-07 2 views
1

Я столкнулся с проблемой группы по DATEPART(). Мой кодГруппа DATEPART() error/error

SELECT con.Name, con.contractID, Sum(cplanit.Cost) as costs, DATENAME(month,month(cplanit.PaymentDate)) as month, year(cplanit.PaymentDate) as year 

FROM ContractTable con 

INNER JOIN [a lot of tables] ON [joins proofed and working fine] 

Group By con.Name, con.contractID, DATEPART(month,cplanit.PaymentDate), DATEPART(year,cplanit.PaymentDate) 

Я получаю это:

Adobe CLP Agreement - Initial purchase C00012121 18.7500 January 2011 
Adobe CLP Agreement - Initial purchase C00012121 18.7500 January 2010 
Adobe CLP Agreement - Initial purchase C00012121 18.7500 January 2011 
Adobe CLP Agreement - Initial purchase C00012121 18.7500 January 2010 
Adobe CLP Agreement - Initial purchase C00012121 18.7500 January 2011 

Одинаковые записи. Затраты группируются точным PaymentDate, а не месяцем и годом - это то, что мне нужно сделать. Эта проблема сохраняется, если я удаляю Datename и год в предложении SELECT или если я группирую только месяц или год. Группировка за исключением DATEPART(), month() или year() для групповой работы. Может быть, это что-то простое, что я пропустил? Иногда я просто слепой.

Встречающегося в SQL Server Management Studio/SQL Server 2012.

+0

Также: Почему предложение group by отличается от полей SELECT? Вы пытались: GROUP BY con.Name, con.contractID, DATENAME (месяц, месяц (cplanit.PaymentDate)), year (cplanit.PaymentDate) – ericpap

+0

«Затраты сгруппированы точным PaymentDate» Я должен исправить себя здесь, там это только один PaymentDate в месяц, вопреки тому, что я думал. Извините за мой пост, я получил решение: The Joins выпустил только несколько строк. Поэтому «отчетливый» решает ее. Большое спасибо, так или иначе, stackoverflow proofed очень полезно для меня несколько раз :) –

+0

@TedOckham. , , Попробуйте удалить вопрос. –

ответ

0

Вы не privide в предложениях GROUP BY полей, которые предусмотрены в ЗЕЬЕСТЕ. Попробуйте следующее:

SELECT con.Name, con.contractID, Sum(cplanit.Cost) as costs, DATENAME(month,month(cplanit.PaymentDate)) as month, year(cplanit.PaymentDate) as year 

FROM ContractTable con 

INNER JOIN [a lot of tables] ON [joins proofed and working fine] 

GROUP BY con.Name, con.contractID, DATENAME(month,month(cplanit.PaymentDate)), year(cplanit.PaymentDate) 

Во всяком случае он работает во всех случаях:

CREATE TABLE #Tempas 
(
    Name NVARCHAR(80), 
    contractID NVARCHAR(20), 
    Data DATETIME2 
) 
INSERT INTO #Tempas VALUES('Adobe CLP Agreement - Initial purchase' ,'1','20010101 10:10:10') 
INSERT INTO #Tempas VALUES('Adobe CLP Agreement - Initial purchase' ,'1','20010101 10:10:10') 
INSERT INTO #Tempas VALUES('Adobe CLP Agreement - Initial purchase' ,'1','20010101 10:10:10') 
INSERT INTO #Tempas VALUES('Adobe CLP Agreement - Initial purchase' ,'1','20010101 10:10:10') 
INSERT INTO #Tempas VALUES('Adobe CLP Agreement - Initial purchase' ,'1','20020101 10:10:10') 
INSERT INTO #Tempas VALUES('Adobe CLP Agreement - Initial purchase' ,'1','20020101 10:10:10') 
INSERT INTO #Tempas VALUES('Adobe CLP Agreement - Initial purchase' ,'1','20020101 10:10:10') 
INSERT INTO #Tempas VALUES('Adobe CLP Agreement - Initial purchase' ,'1','20020101 10:10:10') 

SELECT Name, contractID, DATENAME(month,month(data)) AS Month, year(data) AS year 
FROM #Tempas 
GROUP BY Name, contractID, DATEPART(month,data), DATEPART(year,data) 

DROP TABLE #tempas 

ВЫВОД:

   Name    contractID Month year 
Adobe CLP Agreement - Initial purchase 1 January 2001 
Adobe CLP Agreement - Initial purchase 1 January 2002 

С теми же значениями и следующий запрос:

SELECT Name, contractID, DATENAME(month,month(data)) AS Month, year(data) AS year 
FROM #Tempas 
GROUP BY Name, contractID, DATENAME(month,month(data)), year(data) 

ВЫВОД же:

   Name    contractID Month year 
Adobe CLP Agreement - Initial purchase 1 January 2001 
Adobe CLP Agreement - Initial purchase 1 January 2002 
+0

Большое спасибо –

0

код, кажется, работает хорошо, как это, даже с текущей группой по п. Может ли проблема быть в другой части вашего запроса?

declare @ContractTable table (
Name nvarchar(20), 
ContractId int, 
Cost Decimal, 
PaymentDate DateTime) 

insert into @ContractTable values ('Name', 1, 100, N'20150101') 
insert into @ContractTable values ('Name', 2, 100, N'20150101') 
insert into @ContractTable values ('Name', 1, 100, N'20150102') 
insert into @ContractTable values ('Name', 1, 100, N'20150102') 
insert into @ContractTable values ('Name', 2, 100, N'20150104') 
insert into @ContractTable values ('Name', 2, 100, N'20150104') 
insert into @ContractTable values ('Name', 2, 100, N'20150105') 
insert into @ContractTable values ('Name', 2, 100, N'20150105') 
insert into @ContractTable values ('Name', 2, 100, N'20150105') 
insert into @ContractTable values ('Name', 2, 100, N'20150105') 

SELECT 
    Name 
    ,contractID 
    ,Sum(Cost) as costs 
    ,DATENAME(month,month(PaymentDate)) as [month] 
    ,year(PaymentDate) as [year] 
FROM 
    @ContractTable 
Group By 
    Name 
    ,contractID 
    ,DATEPART(month,PaymentDate) 
    ,DATEPART(year, PaymentDate) 
+0

спасибо, ты прав (сравните мой комментарий) :) –

Смежные вопросы