当前位置: 代码迷 >> Sql Server >> sql 数据库查询有关问题
  详细解决方案

sql 数据库查询有关问题

热度:64   发布时间:2016-04-24 09:19:30.0
sql 数据库查询问题
表内有如下信息
Pname               Pmonth               Prate*100
预算管控系统建置 1                      0
BPM导入              1                       0
投资支出及回收申请单  1                0
教育訓練            1                      0
行政會議            1                      0
其他                1                      0
部门                1                      0
BPM导入            1                      1
预算管控系统建置 1                       1
行政會議            1                      1.85
其他                 1                       2
教育訓練            1                       3.66
部门                 1                     25.55
投资支出及回收申请单 1                    64.93
BPM导入            2                        0
行政會議            2                        0
休假                2                         0
部门                 2                          0
BPM导入            2                        1.04
行政會議             2                       4.69
休假               2                         25
部门               2                        69.27                    
工时管理系统 3                        0
投资支出及回收申请单 3                         0
行政會議           3                        0
部门              3                            0
行政會議           3                   6.67
部门              3                     11.11
工时管理系统 3                    35.56
投资支出及回收申请单 3                   46.67

怎么查询才能有如下 效果   


Pname                    1月          2月     3月
预算管控系统建置 1    0 0
BPM导入           1   1.04 0
投资支出及回收申请单 64.93   0 46.67
工时管理系统 0   0 35.56
行政會議          1.85   4.69 6.67
休假           0   25 0
部门          25.55   69.27 11.11
其他          2                       0                    0
教育訓練         3.66    0 0

------解决思路----------------------
--动态
DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT Pname'
SELECT @SQL=@SQL+'
,ISNULL(SUM(CASE WHEN Pmonth='+CAST(Pmonth AS VARCHAR(10))+' THEN [Prate*100] END),0)['+CAST(Pmonth AS VARCHAR(10))+'月]'
FROM TB GROUP BY Pmonth ORDER BY Pmonth
SET @SQL=@SQL+'FROM TB GROUP BY Pname'
PRINT @SQL
EXEC(@SQL)

--静态方式
SELECT Pname
    ,ISNULL(SUM(CASE WHEN Pmonth=1 THEN [Prate*100] END),0)[1月]
    ,ISNULL(SUM(CASE WHEN Pmonth=2 THEN [Prate*100] END),0)[2月]
    ,ISNULL(SUM(CASE WHEN Pmonth=3 THEN [Prate*100] END),0)[3月]
FROM TB
GROUP BY Pname
TB换成你的表名
------解决思路----------------------
又是行转列~~~用PIVOT,2000的话只能CASE GROUP
------解决思路----------------------
网上太多,自己去尝试写写印象会更深刻
------解决思路----------------------
才40分,真小气,我上次问直接88。
  相关解决方案