高手,再帮忙看一一下:

wanglanxuan1 2015-08-31 09:38:15

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


我是刚接触sql 谢谢了
...全文
89 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Tiger_Zhao 2015-09-01
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
回复
Tiger_Zhao 2015-08-31
WITH /* 测试数据
A(falarm,个数)AS(
SELECT '-ab',7 UNION ALL
SELECT '-ac',5 UNION ALL
SELECT '-bc',4 UNION ALL
SELECT '-dc',3 UNION ALL
SELECT '-be',1
)
,B(姓名,电话)AS(
SELECT '张三',12345678
), */
C AS (
SELECT [1] AS [第一],
[2] AS [第二],
[3] AS [第三],
[4] AS [第四],
[1]+[2]+[3]+[4] AS [总数]
FROM (
SELECT 个数,
ROW_NUMBER() OVER(ORDER BY 个数 DESC) rn
FROM a
) t
PIVOT (MAX(个数)
FOR rn IN ([1],[2],[3],[4])
) p
)
SELECT *
FROM b,c

姓名        电话        第一        第二        第三        第四        总数
---- ----------- ----------- ----------- ----------- ----------- -----------
张三 12345678 7 5 4 3 19
回复
Pact_Alice 2015-08-31
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')
回复
wanglanxuan1 2015-08-31
引用 2 楼 Tiger_Zhao 的回复:
WITH /* 测试数据
A(falarm,个数)AS(
    SELECT '-ab',7 UNION ALL
    SELECT '-ac',5 UNION ALL
    SELECT '-bc',4 UNION ALL
    SELECT '-dc',3 UNION ALL
    SELECT '-be',1
)
,B(姓名,电话)AS(
    SELECT '张三',12345678
), */
C AS (
    SELECT [1] AS [第一],
           [2] AS [第二],
           [3] AS [第三],
           [4] AS [第四],
           [1]+[2]+[3]+[4] AS [总数]
      FROM (
            SELECT 个数,
                   ROW_NUMBER() OVER(ORDER BY 个数 DESC) rn
              FROM a
           ) t
     PIVOT (MAX(个数)
            FOR rn IN ([1],[2],[3],[4])
           ) p
)
SELECT *
  FROM b,c
姓名        电话        第一        第二        第三        第四        总数
---- ----------- ----------- ----------- ----------- ----------- -----------
张三    12345678           7           5           4           3          19
非常感谢 如果想得到的结果再改一下呢: 姓名 电话 第一 第二 第三 第四 总数 ... ..... -ab(7) -ac(5) -bc(4) -dc(3) 19
回复
wanglanxuan1 2015-08-31
引用 2 楼 Tiger_Zhao 的回复:
WITH /* 测试数据
A(falarm,个数)AS(
    SELECT '-ab',7 UNION ALL
    SELECT '-ac',5 UNION ALL
    SELECT '-bc',4 UNION ALL
    SELECT '-dc',3 UNION ALL
    SELECT '-be',1
)
,B(姓名,电话)AS(
    SELECT '张三',12345678
), */
C AS (
    SELECT [1] AS [第一],
           [2] AS [第二],
           [3] AS [第三],
           [4] AS [第四],
           [1]+[2]+[3]+[4] AS [总数]
      FROM (
            SELECT 个数,
                   ROW_NUMBER() OVER(ORDER BY 个数 DESC) rn
              FROM a
           ) t
     PIVOT (MAX(个数)
            FOR rn IN ([1],[2],[3],[4])
           ) p
)
SELECT *
  FROM b,c
姓名        电话        第一        第二        第三        第四        总数
---- ----------- ----------- ----------- ----------- ----------- -----------
张三    12345678           7           5           4           3          19
谢谢 如果想得到的结果变成这个呢: 姓名 电话 第一 第二 第三 第四 总数 ... ..... -ab -ac -bc -dc 19
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-08-31 09:38
社区公告
暂无公告