当前位置: 代码迷 >> Sql Server >> 好手,再帮忙看一一下
  详细解决方案

好手,再帮忙看一一下

热度:55   发布时间:2016-04-24 08:56:50.0
高手,再帮忙看一一下:

 现有表A
  falarm    个数
-ab          7
  -ac           5
  -bc           4
  -dc           3
  -be           1
把表A中个数的前四名放到表B 得到的结果为(姓名, 电话可以从另一张表C中得到):
 姓名     电话      第一  第二      第三  第四   总数
...          .....           7     5            4        3       19


我是刚接触sql 谢谢了  
------解决思路----------------------
CREATE TABLE #t
(
falarm VARCHAR(30),
Number int
)
INSERT INTO #t
SELECT '-ab',7 UNION ALL
SELECT '-ac',5 UNION ALL
SELECT '-bc',4 UNION ALL
SELECT '-dc',3 UNION ALL
SELECT '-be',1

declare @s varchar(max)
set @s='select falarm'
SELECT @s=@s+','+
+case when QUOTENAME(falarm)='[-ab]' THEN '''第一'''
  when QUOTENAME(falarm)='[-ac]' THEN '''第二'''
  when QUOTENAME(falarm)='[-bc]' THEN '''第三'''
  when QUOTENAME(falarm)='[-dc]' THEN '''第四'''
 end
+N'=SUM(CASE falarm WHEN '+QUOTENAME(falarm,N'''')
+N' THEN Number END)'
FROM (SELECT TOP 4* FROM #t t
ORDER BY t.Number desc)a
print(@s+N'
FROM (SELECT TOP 4 * FROM #t t
ORDER BY t.Number desc)a
        group by falarm')
------解决思路----------------------
WITH 
...
,D AS ( -- 再加一个行转列
    SELECT [1] AS [第一],
           [2] AS [第二],
           [3] AS [第三],
           [4] AS [第四]
      FROM (
            SELECT falarm,
                   ROW_NUMBER() OVER(ORDER BY 个数 DESC) rn
              FROM a
           ) t
     PIVOT (MAX(falarm)
            FOR rn IN ([1],[2],[3],[4])
           ) p
)
SELECT * -- 自己根据需要选取/合并c、d的字段
  FROM b,c,d

姓名        电话        第一        第二        第三        第四        总数 第一 第二 第三 第四
---- ----------- ----------- ----------- ----------- ----------- ----------- ---- ---- ---- ----
张三    12345678           7           5           4           3          19 -ab  -ac  -bc  -dc
  相关解决方案