当前位置: 代码迷 >> Sql Server >> SQL条件查询,该如何解决
  详细解决方案

SQL条件查询,该如何解决

热度:68   发布时间:2016-04-24 09:27:28.0
SQL条件查询
本帖最后由 u013099488 于 2015-01-13 15:06:41 编辑
table1
cellphone                  state
13100001231              1
13100005201              1
13166635210              1
13119500101              1
13100956328              1

table2
ID                    Number                 NumberName         Price
1                     520                           谐音                          10
2                     0000                         中4零                        20
3                     1950                         日期                          30
4                     123                           顺序                          40 
5                     666                           连续                          50      

要实现的功能是 表1 中的手机号若包含 表2 中的Number 字段的值就显示出来没有就只显示号码!

最终需要的结果
cellphone                      NumberName    price       NumberName          Price
13100001231              中4零                     20               顺序                     40
13100005201              中4零                     20               谐音                     10
13166635210              连续                       30  
13119500101              日期                       10  
13100956328
------解决思路----------------------
IF OBJECT_ID('tempdb..#test','U') IS NOT NULL DROP TABLE #test
CREATE TABLE #test
(
Mobile VARCHAR(11)
,States INT 
)

IF OBJECT_ID('tempdb..#test1','U') IS NOT NULL DROP TABLE #test1
CREATE TABLE #test1
(
ID INT
,Number VARCHAR(11)
,NumberName NVARCHAR(200)
,Price DECIMAL(9,2)
)

INSERT INTO #test
SELECT '13100001231',              1 UNION ALL
SELECT '13100005201',              1 UNION ALL
SELECT '13166635210',              1 UNION ALL
SELECT '13119500101',              1 UNION ALL
SELECT '13100956328',              1

INSERT INTO #test1
SELECT 1,                     '520',                           '谐音',                          10 UNION ALL
SELECT 2,                     '0000',                         '中4零',                        20 UNION ALL
SELECT 3,                     '1950',                         '日期',                          30 UNION ALL
SELECT 4,                     '123',                           '顺序',                          40  UNION ALL
SELECT 5,                     '666',                           '连续',                          50    


SELECT A.Mobile
,ISNULL(T.NumberName,'') AS NumberName
,ISNULL(T.Price,0) AS Price
INTO #test3
FROM #test AS A
OUTER APPLY (SELECT NumberName,Price FROM #test1 AS B WHERE CHARINDEX(b.Number,A.Mobile,0)>0) T


DECLARE @total INT,@Sql NVARCHAR(MAX)

SELECT @total= MAX(cnt) FROM (SELECT COUNT(1) AS cnt FROM #test3 GROUP BY Mobile)AS A
SELECT @Sql=ISNULL(@Sql+',','')
+'MAX(CASE WHEN rn='+RTRIM(a.number)+' THEN NumberName ELSE '''' END) AS NumberName,'
+'MAX(CASE WHEN rn='+RTRIM(a.number)+' THEN Price ELSE 0 END) AS Price'
FROM  master.dbo.spt_values  AS A
WHERE A.type='P' 
AND number BETWEEN 1 AND @total

SELECT @Sql='SELECT T.Mobile ,'+@Sql+'
FROM (
SELECT *,ROW_NUMBER() OVER(PARTITION BY Mobile ORDER BY GETDATE()) AS rn
FROM #test3 )AS T
GROUP BY T.Mobile'

EXECUTE(@Sql)


------解决思路----------------------
select E.Mobile,E.NumberName,E.Price into table3   
from (select T.Mobile,D.NumberName,D.Price from table1 T left join 
(SELECT A.mobile,NumberName,Price FROM table1 A  ,table2 B
WHERE CHARINDEX(b.Number,A.Mobile,0)>0) D on T.mobile=D.Mobile )E 

declare @sql nvarchar(max);
set @sql='';
;with t  
as  
(  
select *,ROW_NUMBER() over(Partition by mobile order by @@servername) rownum
from table3
)  
 
select @sql = @sql +',max(case when rownum ='+cast(rownum as varchar)+' then NumberName else null end) as NumberName'+  
                  ',max(case when rownum = '+cast(rownum as varchar)+' then Price else null end) as Price'  
              from t group by rownum

SELECT @Sql='SELECT Mobile' + @Sql +
            ' from (select *,ROW_NUMBER() over(Partition by mobile order by @@servername) rownum
from table3
            )t' +
           ' GROUP BY Mobile '
 
exec(@sql)
  相关解决方案