当前位置: 代码迷 >> Sql Server >> sql单表查询怎么实现
  详细解决方案

sql单表查询怎么实现

热度:66   发布时间:2016-04-24 10:21:09.0
sql单表查询如何实现
姓名      消费时间            现金        银行卡    
张三       2013-1-1            400        50
李四        2013-5-8            900     1522
张三        2014-3-9            333        555
李四        2014-6-15          444        777
我要求出用SQL查询:
姓名                 2013年业绩                          2014年业绩
张三        2013年的现金+银行卡        2014年的现金+银行卡
李四        2013年的现金+银行卡        2014年的现金+银行卡 
.....           2013年的现金+银行卡        2014年的现金+银行卡
------解决方案--------------------
----------------------------------------------------------------
-- Author  :DBA_HuangZJ(發糞塗牆)
-- Date    :2014-07-15 16:11:45
-- Version:
--      Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
-- May 14 2014 18:34:29 
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[消费明细表]
if object_id('[消费明细表]') is not null drop table [消费明细表]
go 
create table [消费明细表]([顾客姓名] varchar(5),[消费时间] datetime,[现金] int,[银行卡] int,[服务人编号] int)
insert [消费明细表]
select '顾客A','2013-1-1',500,1000,1 union all
select '顾客A','2014-5-1',500,1000,1 union all
select '顾客B','2013-2-1',500,1000,2 union all
select '顾客B','2014-6-1',500,1000,2
--> 测试数据:[员工信息表]
if object_id('[员工信息表]') is not null drop table [员工信息表]
go 
create table [员工信息表]([姓名] varchar(4),[编号] int,[性别] varchar(2))
insert [员工信息表]
select '张三',1,'女' union all
select '李四',2,'男'
--------------开始查询--------------------------



select b.[姓名],MAX(CASE WHEN [消费时间] BETWEEN '2013-01-01' AND '2013-12-31' THEN [现金]+[银行卡] ELSE 0 END)AS '2013年业绩', 
MAX(CASE WHEN [消费时间] BETWEEN '2014-01-01' AND '2014-12-31' THEN [现金]+[银行卡] ELSE 0 END)AS '2014年业绩'
from [消费明细表] a INNER JOIN [员工信息表] b ON a.服务人编号=b.编号
GROUP BY b.[姓名]
----------------结果----------------------------
/* 
姓名   2013年业绩     2014年业绩
---- ----------- -----------
李四   1500        1500
张三   1500        1500
*/
  相关解决方案