2016-08-03 4 views
0

Когда пользователь платит за свой продукт, я добавляю платежную запись в PaymentTBL, Теперь я хочу узнать количество всех первых платежей в месяц. Я построил этот запрос:Получить счет первых записей в SQL Server

SELECT Count(*) as OptIn, Month(StartDate) As MonthNum, Year(StartDate) As YearNum 
    FROM [dietdb].[dbo].[PaymentsTBL] 

    group by Month(StartDate), Year(StartDate) 

Но это не дает мне то, что я хочу точно, потому что мне нужно знать только те, кто начинает с приложением в этом месяце, а не тех, кто расхождения/обновить свои платежи.

Есть ли хороший способ достичь этого?

Ниже представлена ​​структура PaymentTBL:

CREATE TABLE [dbo].[PaymentsTBL](
    [AutoNo] [int] IDENTITY(1,1) NOT NULL, 
    [PersonID] [nvarchar](50) NOT NULL, 
    [UDID] [nvarchar](50) NULL, 
    [StartDate] [datetime] NULL, 
    [Duration] [float] NULL CONSTRAINT [DF_PaymentsTBL_Duration] DEFAULT ((0)), 
    [EndDate] [datetime] NULL, 
    [Points] [float] NULL CONSTRAINT [DF_PaymentsTBL_Points] DEFAULT ((0)), 
    [Cost] [float] NULL CONSTRAINT [DF_PaymentsTBL_Cost] DEFAULT ((0)), 
    [Currency] [int] NULL CONSTRAINT [DF_PaymentsTBL_Currency] DEFAULT ((0)), 
    [TypeID] [int] NULL CONSTRAINT [DF_PaymentsTBL_TypeID] DEFAULT ((2)), 
    [IsActive] [bit] NULL CONSTRAINT [DF_PaymentsTBL_IsActive] DEFAULT ((0)), 
    [InsertDate] [datetime] NULL CONSTRAINT [DF_PaymentsTBL_InsertDate] DEFAULT (getdate()), 
    [InsertUser] [nvarchar](50) NULL, 
    [UpdateDate] [datetime] NULL CONSTRAINT [DF_PaymentsTBL_UpdateDate] DEFAULT (getdate()), 
    [UpdateUser] [nvarchar](50) NULL, 
    [PayBy] [int] NULL CONSTRAINT [DF_PaymentsTBL_PayBy] DEFAULT ((1)), 
CONSTRAINT [PK_PaymentsTBL] PRIMARY KEY CLUSTERED 
(
    [AutoNo] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

Образец данных, что мне нужно:

OptIn MonthNo YearNo 
47 1 2015 
56 2 2015 
72 3 2015 
61 4 2015 
74 5 2015 
43 6 2015 
154 7 2015 
180 8 2015 
190 9 2015 
139 10 2015 
169 11 2015 
117 12 2015 
147 1 2016 
137 2 2016 
135 3 2016 
154 4 2016 
141 5 2016 
109 6 2016 
162 7 2016 
75 8 2016 
+2

Покажите нам некоторые примеры данных таблицы, завершите ожидаемый результат! – jarlh

+0

Да, я добавил структуру таблицы –

+0

Покажите нам некоторые данные таблицы образцов –

ответ

1

Попробуйте

SELECT Count(*) as OptIn, Month(StartDate) As MonthNum, Year(StartDate) As YearNum FROM 
(
select PersonID, min(startdate) as startdate FROM [dietdb].[dbo].[PaymentsTBL] 
group by PersonID 
) as t 
group by Month(StartDate), Year(StartDate) 
+0

Кажется, у вас есть то, что я имею в виду, но, пожалуйста, проверьте, что у вас есть синтаксическая ошибка. Неверный синтаксис рядом с ключевым словом «включено». –

0

Вы можете попробовать этот запрос: -

SELECT Count(*) as OptIn, Month(StartDate) As MonthNum, Year(StartDate) As YearNum 
FROM [dietdb].[dbo].[PaymentsTBL] 
WHERE Month(StartDate) = MONTH(GETDATE()) 
AND Year(StartDate) = YEAR(GETDATE()) 
group by Month(StartDate), Year(StartDate) 

Надеется, что это помогает.

0

Я думаю, что вы хотите, запись первого платежа в каждом месяце.

колонка ID является первичным ключом таблицы

SELECT min(id) as OptIn, Month(StartDate) As MonthNum, Year(StartDate) As YearNum 
FROM [dietdb].[dbo].[PaymentsTBL] 
group by Month(StartDate), Year(StartDate) 
1

Я думаю, что вы можете использовать row_number(), чтобы определить человека первый платеж, а затем рассчитывать те, в месяц, как это:

select 
     Month(StartDate) MonthNo 
    , Year(StartDate) YearNo 
    , count(case when rn = 1 then 1 end) as OptIn 
    , count(*) as count_all 
from (
    select 
     * 
     , row_number() over(partition by PersonID order by StartDate) as rn 
    from PaymentsTBL 
    ) d 
group by 
     Month(StartDate) 
    , Year(StartDate) 
+0

от PK_PaymentsTBL !!! –

+0

нормально, получилось, спасибо –

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