linq to sql - How to write Sql or LinqToSql for this scenario? -
how write sql or linqtosql scenario?
a table has following data:
id username price date status 1 mike 2 2010-4-25 0:00:00 success 2 mike 3 2010-4-25 0:00:00 fail 3 mike 2 2010-4-25 0:00:00 success 4 lily 5 2010-4-25 0:00:00 success 5 mike 1 2010-4-25 0:00:00 fail 6 lily 5 2010-4-25 0:00:00 success 7 mike 2 2010-4-26 0:00:00 success 8 lily 5 2010-4-26 0:00:00 fail 9 lily 2 2010-4-26 0:00:00 success 10 lily 1 2010-4-26 0:00:00 fail
i want summary result data, result should be:
username date totalprice totalrecord successrecord failrecord mike 2010-04-25 8 4 2 2 lily 2010-04-25 10 2 2 0 mike 2010-04-26 2 1 1 0 lily 2010-04-26 8 3 1 2 totalprice sum(price) groupby username , date totalrecord count(*) groupby username , date successrecord count(*) groupby username , date status='success' failrecord count(*) groupby username , date status='fail' totalrecord = successrecord + failrecord
the sql server 2005 database script is:
/****** object: table [dbo].[pay] script date: 04/28/2010 22:23:42 ******/ set ansi_nulls on go set quoted_identifier on go if not exists (select * sys.objects object_id = object_id(n'[dbo].[pay]') , type in (n'u')) begin create table [dbo].[pay]( [id] [int] identity(1,1) not null, [username] [nvarchar](50) collate chinese_prc_ci_as null, [price] [int] null, [date] [datetime] null, [status] [nvarchar](50) collate chinese_prc_ci_as null, constraint [pk_pay] primary key clustered ( [id] asc )with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) ) end go set identity_insert [dbo].[pay] on insert [dbo].[pay] ([id], [username], [price], [date], [status]) values (1, n'mike', 2, cast(0x00009d6300000000 datetime), n'success') insert [dbo].[pay] ([id], [username], [price], [date], [status]) values (2, n'mike', 3, cast(0x00009d6300000000 datetime), n'fail') insert [dbo].[pay] ([id], [username], [price], [date], [status]) values (3, n'mike', 2, cast(0x00009d6300000000 datetime), n'success') insert [dbo].[pay] ([id], [username], [price], [date], [status]) values (4, n'lily', 5, cast(0x00009d6300000000 datetime), n'success') insert [dbo].[pay] ([id], [username], [price], [date], [status]) values (5, n'mike', 1, cast(0x00009d6300000000 datetime), n'fail') insert [dbo].[pay] ([id], [username], [price], [date], [status]) values (6, n'lily', 5, cast(0x00009d6300000000 datetime), n'success') insert [dbo].[pay] ([id], [username], [price], [date], [status]) values (7, n'mike', 2, cast(0x00009d6400000000 datetime), n'success') insert [dbo].[pay] ([id], [username], [price], [date], [status]) values (8, n'lily', 5, cast(0x00009d6400000000 datetime), n'fail') insert [dbo].[pay] ([id], [username], [price], [date], [status]) values (9, n'lily', 2, cast(0x00009d6400000000 datetime), n'success') insert [dbo].[pay] ([id], [username], [price], [date], [status]) values (10, n'lily', 1, cast(0x00009d6400000000 datetime), n'fail') set identity_insert [dbo].[pay] off
one possible sql query be:
select username ,date ,sum(price) totalpay ,count(*) totalrecord ,sum(case status when 'success' 1 else 0 end) successrecord ,sum(case status when 'success' 0 else 1 end) failrecord pay group username ,date order date ,username desc
this assumes when status null, you'd add 1 failrecord.
Comments
Post a Comment