按任意的字段旋转的存储过程

----------------------------------------------------------------------------
-- 分段截取函数
----------------------------------------------------------------------------
CREATE    FUNCTION DBO.FUN_SplitStr(
@S VARCHAR(8000),      -- 包含多个数据项的字符串
@POS INT,              -- 要获取的数据项的位置
@SPLIT VARCHAR(10)    -- 数据分隔符
) RETURNS VARCHAR(128)
AS
BEGIN
IF @S IS NULL RETURN(NULL)
DECLARE @SPLITLEN INT
SELECT @SPLITLEN=LEN(@SPLIT+'A')-2
WHILE @POS>1 AND CHARINDEX(@SPLIT,@S+@SPLIT)>0 BEGIN
SELECT @POS=@POS-1,
@S=STUFF(@S,1,CHARINDEX(@SPLIT,@S+@SPLIT)+@SPLITLEN,'')
END
RETURN  LEFT(@S,CHARINDEX(@SPLIT,@S+@SPLIT)-1)
END

GO
-------------------------------------------
--行列转换
-------------------------------------------

-------------------------------------------
--行列转换
-------------------------------------------
CREATE  PROC PRC_CORSSQUERY
@NVR_TABNAME AS NVARCHAR(1024) = '', -- 此处放表名
@NVR_XCOL AS NVARCHAR(1024) = '', -- 表头分组依据字段 (横向字段,以系统编号作为依据,内部转化,此字段只能有一个)
@NVR_YCOL AS NVARCHAR(1024) = '', -- 分组字段        (纵向字段,直接取名称列,可以有多个,多个用逗号分隔)
@NVR_STATCOL AS NVARCHAR(1024) = '', -- 被统计的字段    (值)
@NVR_WHERE AS NVARCHAR(4000)='', -- WHERE条件  (一定要带 WHERE 语句,如:WHERE 地区=''广州'' )  * 注意字符一定要用两个分号.
@NVR_TOTAL AS NVARCHAR(1024)='', -- 合计的公式( SUM,AVG ,将其放在第一列.如果多项,请用逗号分隔)
@NVR_ORDERBY AS NVARCHAR(1024)=''          -- 排序字段,如: [海关编码],[地区]
AS BEGIN

    --SET NOCOUNT ON

DECLARE @NVR_CMD AS NVARCHAR(4000)
DECLARE @NVR_XCOLNAME AS NVARCHAR(256)

DECLARE @NVR_SQL0 AS NVARCHAR(4000)
DECLARE @NVR_SQL1 AS NVARCHAR(4000)
DECLARE @NVR_SQL2 AS NVARCHAR(4000)
DECLARE @NVR_SQL3 AS NVARCHAR(4000)
DECLARE @NVR_SQL4 AS NVARCHAR(4000)
DECLARE @NVR_SQL5 AS NVARCHAR(4000)
DECLARE @NVR_SQL6 AS NVARCHAR(4000)
DECLARE @NVR_SQL7 AS NVARCHAR(4000)
DECLARE @NVR_SQL8 AS NVARCHAR(4000)
DECLARE @NVR_SQL9 AS NVARCHAR(4000)
DECLARE @NVR_SQL10 AS NVARCHAR(4000)
DECLARE @NVR_SQL11 AS NVARCHAR(4000)
DECLARE @NVR_SQL12 AS NVARCHAR(4000)
DECLARE @NVR_SQL13 AS NVARCHAR(4000)
DECLARE @NVR_SQL14 AS NVARCHAR(4000)
DECLARE @NVR_SQL15 AS NVARCHAR(4000)
DECLARE @NVR_SQL16 AS NVARCHAR(4000)
DECLARE @NVR_SQL17 AS NVARCHAR(4000)
DECLARE @NVR_SQL18 AS NVARCHAR(4000)
DECLARE @NVR_SQL19 AS NVARCHAR(4000)
DECLARE @NVR_SQL20 AS NVARCHAR(4000)

DECLARE @NVR_DATETYPE AS NVARCHAR(1)
DECLARE @INT_ID AS INT
DECLARE @NVR_GOODSUNIT AS NVARCHAR(32)
DECLARE @INT_UNIT INT

SELECT @NVR_SQL0='',@INT_ID=0,@NVR_SQL0='',@NVR_SQL1='',@NVR_SQL2='',@NVR_SQL3='',@NVR_SQL4='',@NVR_SQL5='',@NVR_SQL6='',@NVR_SQL7='',@NVR_SQL8='',@NVR_SQL9='',
@NVR_SQL10='',@NVR_SQL11='',@NVR_SQL12='',@NVR_SQL13='',@NVR_SQL14='',@NVR_SQL15='',@NVR_SQL16='',@NVR_SQL17='',@NVR_SQL18='',@NVR_SQL19='',@NVR_SQL20=''
 
DECLARE @INT_I INT
DECLARE @NVR_FLDNAME NVARCHAR(128)

SET @NVR_SQL0 = ' SELECT ' +  @NVR_YCOL
-- 横向合计
DECLARE @NVR_SPTOTAL NVARCHAR(512)
DECLARE @INT_N AS INT
DECLARE @NVR_TOTALSQL  NVARCHAR(512)

SELECT  @INT_N=0,@NVR_TOTALSQL='',@NVR_TOTAL=RTRIM(LTRIM(ISNULL(@NVR_TOTAL,'')))
IF @NVR_TOTAL <>'' BEGIN
WHILE (1=1) BEGIN
    SET @INT_N=@INT_N+1
    SELECT @NVR_SPTOTAL= DBO.FUN_SplitStr(@NVR_TOTAL,@INT_N,',')  -- 以逗号为分隔
    SET @NVR_SPTOTAL=LTRIM(RTRIM(ISNULL(@NVR_SPTOTAL,'')))
    IF  @NVR_SPTOTAL <>'' BEGIN
        IF @NVR_SPTOTAL='SUM' BEGIN
            SET @NVR_TOTALSQL=@NVR_TOTALSQL + ',' + @NVR_SPTOTAL + '(' + @NVR_STATCOL + ') AS [SUM]'
        END ELSE IF @NVR_SPTOTAL='AVG' BEGIN
            SET @NVR_TOTALSQL=@NVR_TOTALSQL + ',' + @NVR_SPTOTAL + '(' + @NVR_STATCOL + ') AS [AVG]'
END ELSE IF @NVR_SPTOTAL='MAX' BEGIN
            SET @NVR_TOTALSQL=@NVR_TOTALSQL + ',' + @NVR_SPTOTAL + '(' + @NVR_STATCOL + ') AS [MAX]'
END ELSE IF @NVR_SPTOTAL='MIN' BEGIN
            SET @NVR_TOTALSQL=@NVR_TOTALSQL + ',' + @NVR_SPTOTAL + '(' + @NVR_STATCOL + ') AS [MIN]'
        END
    END ELSE BEGIN
        BREAK
    END
END
SET @NVR_SQL0=@NVR_SQL0 + @NVR_TOTALSQL
END

SET @NVR_CMD='DECLARE CORSS_CURSOR CURSOR FOR SELECT DISTINCT ' + @NVR_XCOL + '  FROM ' + @NVR_TABNAME + ' ' + @NVR_WHERE + ' ORDER BY ' + @NVR_XCOL + ' FOR READ ONLY ' --生成游标


EXECUTE (@NVR_CMD)
OPEN CORSS_CURSOR

WHILE (1=1)  BEGIN
FETCH NEXT FROM CORSS_CURSOR INTO @NVR_XCOLNAME  --遍历游标,将列头信息放入变量@NVR_XCOLNAME
IF (@@FETCH_STATUS <>0) BREAK

SET @INT_ID=@INT_ID+1
SET @NVR_XCOLNAME=REPLACE(@NVR_XCOLNAME ,CHAR(39),CHAR(39)+CHAR(39))

------------------------------------------------------------------------------
-- 可添加 数量,单价,金额 同时显示.单价= ( 金额 / 数量) .
IF @INT_ID <=50
    SET @NVR_SQL1 = @NVR_SQL1 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF @INT_ID <=100
    SET @NVR_SQL2 = @NVR_SQL2 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=150
    SET @NVR_SQL3 = @NVR_SQL3 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=200
    SET @NVR_SQL4 = @NVR_SQL4 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=250
    SET @NVR_SQL5 = @NVR_SQL5 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=300
    SET @NVR_SQL6 = @NVR_SQL6 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=350
    SET @NVR_SQL7 = @NVR_SQL7 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=400
    SET @NVR_SQL8 = @NVR_SQL8 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=450
    SET @NVR_SQL9 = @NVR_SQL9 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=500
    SET @NVR_SQL10 = @NVR_SQL10 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=550
    SET @NVR_SQL11 = @NVR_SQL11 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=600
    SET @NVR_SQL12 = @NVR_SQL12 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=650
    SET @NVR_SQL13 = @NVR_SQL13 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=700
    SET @NVR_SQL14 = @NVR_SQL14 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=750
    SET @NVR_SQL15 = @NVR_SQL15 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=800
    SET @NVR_SQL16 = @NVR_SQL16 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=850
    SET @NVR_SQL17 = @NVR_SQL17 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=900
    SET @NVR_SQL18 = @NVR_SQL18 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=950
    SET @NVR_SQL19 = @NVR_SQL19 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
ELSE IF  @INT_ID <=1000
    SET @NVR_SQL20 = @NVR_SQL20 + ',SUM(CASE ' + @NVR_XCOL + ' WHEN ''' + @NVR_XCOLNAME + ''' THEN ' + @NVR_STATCOL + ' ELSE NULL END) AS [' + @NVR_XCOLNAME + ']' --构造查询
END -- WHILE (1 = 1)

--直接返回结果.
IF @NVR_ORDERBY='' BEGIN  --未指定排序字段.
EXECUTE ( @NVR_SQL0 + @NVR_SQL1 + @NVR_SQL2  + @NVR_SQL3 + @NVR_SQL4 + @NVR_SQL5 + @NVR_SQL6 + @NVR_SQL7 + @NVR_SQL8 + @NVR_SQL9
+ @NVR_SQL10 + @NVR_SQL11 + @NVR_SQL12  + @NVR_SQL13 + @NVR_SQL14 + @NVR_SQL15 + @NVR_SQL16 + @NVR_SQL17 + @NVR_SQL18 + @NVR_SQL19 + @NVR_SQL20
+ N' FROM ' + @NVR_TABNAME + N' ' + @NVR_WHERE + N' GROUP BY ' + @NVR_YCOL )                                                -- 执行
END ELSE BEGIN            --指定排序字段.
EXECUTE (N'SELECT * FROM (' +  @NVR_SQL0 + @NVR_SQL1 + @NVR_SQL2  + @NVR_SQL3 + @NVR_SQL4 + @NVR_SQL5 + @NVR_SQL6 + @NVR_SQL7 + @NVR_SQL8 + @NVR_SQL9
+ @NVR_SQL10 + @NVR_SQL11 + @NVR_SQL12  + @NVR_SQL13 + @NVR_SQL14 + @NVR_SQL15 + @NVR_SQL16 + @NVR_SQL17 + @NVR_SQL18 + @NVR_SQL19 + @NVR_SQL20
+ N' FROM ' + @NVR_TABNAME + N' ' + @NVR_WHERE + N' GROUP BY ' + @NVR_YCOL  + N') AS T86C6S9R ORDER BY ' + @NVR_ORDERBY )  -- 执行
END

CLOSE CORSS_CURSOR
DEALLOCATE CORSS_CURSOR
RETURN 0 --释放游标,返回0表示成功
END

GO



--
--下面用海关数据仓库的实例表,测试
--
EXECUTE PRC_CORSSQUERY_A 'DAT_2007','海关编号','商品编号,国家编号,地区行政编号','金额','WHERE 时间编号 BETWEEN 20070401 AND 20070401  AND 商品编号=''07131010_09'''

商品编号                    国家编号 地区行政编号 22                                                    37                                                    51                                                    52                                                    95                                                    97                                                   
------------------------ ---- ------ ----------------------------------------------------- ----------------------------------------------------- ----------------------------------------------------- ----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
07131010_09              111  310000 2156.0                                                NULL                                                  NULL                                                  NULL                                                  NULL                                                  NULL
07131010_09              116  350200 NULL                                                  0.0                                                  NULL                                                  NULL                                                  NULL                                                  NULL
07131010_09              116  620100 NULL                                                  NULL                                                  NULL                                                  NULL                                                  0.0                                                  NULL
07131010_09              116  630100 NULL                                                  NULL                                                  NULL                                                  NULL                                                  NULL                                                  0.0
07131010_09              143  350200 NULL                                                  4669.0                                                NULL                                                  NULL                                                  NULL                                                  NULL
07131010_09              143  440100 NULL                                                  NULL                                                  6190.0                                                14400.0                                              NULL                                                  NULL
07131010_09              305  620100 NULL                                                  NULL                                                  NULL                                                  NULL                                                  219.0                                                NULL
07131010_09              502  440100 NULL                                                  NULL                                                  0.0                                                  NULL                                                  NULL                                                  NULL
07131010_09              601  440100 NULL                                                  NULL                                                  19185.0                                              NULL                                                  NULL                                                  NULL

(所影响的行数为 9 行)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS之REM属性

什么是REM: rem指根em。它的产生是为了帮助人们解决em所带来的计算问题&#xff0c;它是字体排版的一个单位&#xff0c;等同于根font-size。这意味着1rem等同于<html>中的font-size 实例&#xff1a; 正如您看到的&#xff0c;无论您在哪里设置它&#xff0c;1rem的取…

Linux系统下.ko文件是什么文件?.so文件是什么文件?

.so 文件是动态链接库文件&#xff0c;相当于 win下的 .dll 文件。 .ko 是内核模块文件&#xff0c;是内核加载的某个模块&#xff0c;一般是驱动程序。

vue-cli3全面配置详解

vue-cli3全面配置详解 vue-cli3-config 创建项目 配置环境变量 通过在package.json里的scripts配置项中添加–mode xxx来选择不同环境 在项目根目录中新建.env, .env.production, .env.analyz等文件 只有以 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧…

Android 开发环境在 Windows7 下的部署安装

Android SDK Android SDK 为 Android 应用的开发、测试和调试提了必要的API库和开发工具。 ADT Bundle 下载 如果你是一个android 开发新手&#xff0c;推荐你下载使用 ADT Bundle 以快速开始android 的开发&#xff0c;它提供了必要的 android sdk 组件和一个内置 ADT 的 Ecli…

CSS之REM和EM的区别

事实证明。rem 和 em 均有各自的优缺点。应给根据实际情况来判断其使用方式 1.如果这个属性是根据它的font-size进行测量&#xff0c;则该属性最好使用em 2.其他的一切事物均使用rem #

Cisco路由器故障诊断技术(3)

Cisco路由器故障诊断技术(3)<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />3.4 trace命令 trace命令提供路由器到目的地址的每一跳的信息。它通过控制IP报文的生存期&#xff08;TTL&#xff09;字段来实现。TTL等于1的ICM…

《疯狂的简洁》书摘

头脑和常识催生简洁 复杂会让人带来安全感&#xff0c;复杂和简洁是一对矛盾&#xff0c;复杂不一定优于简洁 复杂可以变得很丑陋 一切始于简洁&#xff0c;坚持原则&#xff0c;抵御复杂&#xff0c;头脑聪慧且真心实意 人们喜欢事情的透明化 直率即简洁&#xff0c;迂回就是复…

linux kill 关闭进程命令

点评&#xff1a;杀死进程最安全的方法是单纯使用kill命令&#xff0c;不加修饰符&#xff0c;不带标志。 首先使用ps -ef命令确定要杀死进程的PID&#xff0c;然后输入以下命令&#xff1a; # kill -pid 注释&#xff1a;标准的kill命令通常都能达到目的。终止有问题的进…

侯捷:搞Windows程序设计我们需要啥

侯捷&#xff1a;搞Windows程序设计我们需要啥如果你是一位资深的Windows程序员&#xff0c;相信你对Jeffrey Richter一定不会陌生&#xff0c;是不是有些崇拜和景仰&#xff1f;如果你是一位刚涉足这个领域的Windows程序员&#xff0c;Jeffrey Richter是何许人也许你还不能立刻…

CSS之vmin和vmax

vh和vm总是与视口的高度和宽度有关&#xff0c;与之不同的&#xff0c;vmin和vmax是与当下屏幕的宽度和高度的最大值或最小值有关&#xff0c;取决于哪个更大和更小 例如&#xff0c;如果浏览器设置为1100px宽、700px高&#xff0c;1vmin会是较小的7px&#xff0c;而1vmax将是…

vue element-ui级联选择器选中后下拉框自动收起

Cascader 级联选择器 数据渲染 通过 :options“options” 映射,让每一级都可以选择(选项前会有圆圈可勾选)设置属性 :props"{ checkStrictly: true }" 1、点击后下拉框自动收起实现 设置每次监听值变化的时候&#xff0c;把 dropDownVisible 属性设置为 false 即可。…

CodeForces 444C 节点更新求变化值的和

http://vjudge.net/problem/viewProblem.action?id51622 题目大意&#xff1a; 给定一列n个数字&#xff0c;最初赋予值1到n 两个操作&#xff1a;1.将区间[l,r]内的数改为x&#xff0c;则这区间中所有数的改变值进行求和&#xff0c;即ansabs(a[l]-x)abs[a[l1]-x).....abs(a[…

CSS之calc()使用

1.什么是calc() calc()从字面我们可以把他理解为一个函数function。其实calc是英文单词calculate(计算)的缩写&#xff0c;是css3的一个新增的功能&#xff0c;用来指定元素的长度 2.calc()能做什么&#xff1f; calc()能让你给元素的值做计算&#xff0c;你可以给一个div元…

显示当前行号、文件名和函数名

在编程时&#xff0c;有时需要知道当前的代码是在第几行&#xff0c;当前文件名是什么&#xff0c;以及当前执行的是哪个函数&#xff1f;下面的代码可以轻松地完成这种功能&#xff1a; #include <stdio.h>void test(){printf("Line:%d, File:%s, Function:%s\n&q…

百安俱乐部关于“BotNet专题讨论”资料

•BotNet专题讨论 演讲者&#xff1a;叶子 典型BotNet案件 •什么是BotNet •BotNet原理及其危害 BotNet的发展BotNet的形成 BotNet的传播 BotNet的控制 BotNet的危害•BotNet防范与处理 •BotNet的发展趋势分析 •典型BotNet程序的技术分析转载于:https://blog.51cto.com…

Vue给项目添加进度条

前言 在PC端项目的开发过程中&#xff0c;有时我们需要给项目添加一个进度条来展示界面是否已经完成加载的情况。那么如何才能成功添加进度条呢&#xff1f; 添加方式 用法1: 在拦截器中使用 1.引入插件Nprogress npm install --save nprogress 2.在main.js中引入对应的包文…

显示当前行号、文件名和函数名(二)

为了测试__FILE__, __LINE__, __FUNCTION__&#xff0c; 又写了一个C版本的测试程序&#xff0c;源码如下&#xff1a; #include <iostream> #include <string>using namespace std;class CUser { private:int m_nId;string m_sName;public:CUser(int id, string …