读书人

sql语句的查询有关问题

发布时间: 2013-08-09 15:16:24 作者: rapoo

sql语句的查询问题
2个表,表结构如下
phonetable(phone,pwd)//电话表
balance(phone,query_date,balance)//不同日期的余额

例子数据如下
phonetable
123456789 pwd
987654321 pwd

balance
phone query_date balance
123456789 20120725 12.5
123456789 20130725 25
123456789 20140725 50
987654321 20130101 60

现在需要列出所有号码的不同日期的余额,结果如下

号码 20120725 20130101 12130725 20140725
123456789 12.5 25 50
987654321 60

想了半天不知道怎么做,那位高人能给出解决方案呢?
[解决办法]

CREATE TABLE phonetable(phone VARCHAR(100), pwd VARCHAR(100))
INSERT phonetable SELECT '123456789', 'pwd' UNION ALL SELECT '987654321', 'pwd'
CREATE TABLE balance(phone VARCHAR(100), query_date VARCHAR(10), balance float)
INSERT balance
select '123456789','20120725', 12.5 union all
select '123456789','20130725', 25 union all
select '123456789','20140725', 50 union all
select '987654321','20130101', 60
--静态sql,仅供参考:
SELECT *
FROM
(
SELECT a.phone, b.query_date, b.balance
FROM phonetable A
LEFT JOIN balance B
ON a.phone = b.phone
) T
PIVOT
(
MAX(balance) FOR query_date
IN([20120725],[20130101], [12130725], [20140725])--日期不固定的情况下,只能用拼SQL实现
) M

--拼SQL
DECLARE @datelist NVARCHAR(max), @sql NVARCHAR(MAX)
SELECT @datelist = N'', @sql = N''
SELECT @datelist = @datelist + ',' + QUOTENAME(query_date)
FROM balance ORDER BY query_date

SET @sql = N'
SELECT *
FROM
(
SELECT a.phone, b.query_date, b.balance


FROM phonetable A
LEFT JOIN balance B
ON a.phone = b.phone
) T
PIVOT
(
MAX(balance) FOR query_date
IN('+ STUFF(@datelist,1,1,'') +')--日期不固定的情况下,只能用拼SQL实现
) M
'
--PRINT @sql
EXEC(@sql)

/*
phone20120725201301012013072520140725
12345678912.5NULL2550
987654321NULL60NULLNULL
*/


[解决办法]

CREATE TABLE phonetable(phone VARCHAR(100), pwd VARCHAR(100))
INSERT phonetable SELECT '123456789', 'pwd' UNION ALL SELECT '987654321', 'pwd'
CREATE TABLE balance(phone VARCHAR(100), query_date VARCHAR(10), balance float)
INSERT balance
select '123456789','20120725', 12.5 union all
select '123456789','20130725', 25 union all
select '123456789','20140725', 50 union all
select '987654321','20130101', 60
go

--SQL SERVER 2000 静态SQL
select phone,
max(case query_date when '20120725' then balance else NULL end) '20120725',
max(case query_date when '20130725' then balance else NULL end) '20130725',
max(case query_date when '20140725' then balance else NULL end) '20140725',
max(case query_date when '20130101' then balance else NULL end) '20130101'
from balance
group by phone
go
--SQL SERVER 2000 动态SQL
declare @sql varchar(8000)
set @sql = 'select phone '
select @sql = @sql + ' , max(case query_date when ''' + query_date + ''' then balance else NULL end) [' + query_date + ']'
from (select distinct query_date from balance) as a
set @sql = @sql + ' from balance group by phone'
exec(@sql)
go
---------------------------------------------------
--SQL SERVER 2005 静态SQL。
select * from balance a pivot (max(balance) for query_date in ([20120725],[20130725],[20140725],[20130101])) b
go
--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + query_date from balance group by query_date


set @sql = '[' + @sql + ']'
exec ('select * from balance a pivot (max(balance) for query_date in (' + @sql + ')) b')
go

读书人网 >SQL Server

热点推荐