博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
张同学的 SQL中对材料报价单的数据权限进行操作 (如列转行 行转列的处理) 学习一下....
阅读量:5228 次
发布时间:2019-06-14

本文共 5309 字,大约阅读时间需要 17 分钟。

SQL中对材料报价单的数据权限进行操作 (如列转行 行转列的处理)
--可以直接放到查询分析器执行
--判断测试表TmpTCIQuote是否有存在 不存在则创建
if NOT exists (select * from dbo.sysobjects where id = object_id(N'dbo.TmpTCIQuote') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN 
create table TmpTCIQuote(
CIQuotesID   int not null,             --材料报价单ID
cSubInvCode VARCHAR(100) NOT NULL,     --材料编码
cVen1       VARCHAR(50),    --材料厂编码1
cMVenName1  VARCHAR(200),    --材料厂名称1
cVen2       VARCHAR(50),    --材料厂编码2
cMVenName2  VARCHAR(200),    --材料厂名称2
cVen3       VARCHAR(50),    --材料厂编码3
cMVenName3  VARCHAR(200)    --材料厂名称3
primary key (CIQuotesID)
);
END 
--清空数据
TRUNCATE TABLE TmpTCIQuote
--插入默认数据
INSERT INTO TmpTCIQuote(CIQuotesID,cSubInvCode,cVen1,cMVenName1,cVen2,cMVenName2,cVen3,cMVenName3)
SELECT 1,'39010000098','100595','东莞利丰商标制造有限公司','100823','广州南沙经济技术开发区彩佳印花有限公司','100436','晋江市绿雨彩色印刷有限公司' UNION ALL 
SELECT 2,'39080000001','100823','广州南沙经济技术开发区彩佳印花有限公司','100595','东莞利丰商标制造有限公司',NULL,NULL UNION ALL 
SELECT 3,'39150000101','100436','晋江市绿雨彩色印刷有限公司',NULL,NULL,'100595','东莞利丰商标制造有限公司' UNION ALL 
SELECT 4,'39150000101','100436','晋江市绿雨彩色印刷有限公司',NULL,NULL,NULL,NULL
SELECT * FROM TmpTCIQuote
/*
原始数据
ID    材料编码  材料厂编码1     材料厂名称1   材料厂编码2     材料厂名称2    材料厂编码3     材料厂名称3
1 39010000098   100595 东莞利丰商标制造有限公司 100823 广州南沙经济技术开发区彩佳印花有限公司 100436 晋江市绿雨彩色印刷有限公司
2 39080000001   100823 广州南沙经济技术开发区彩佳印花有限公司 100595 东莞利丰商标制造有限公司 NULL NULL
3 39150000101   100436 晋江市绿雨彩色印刷有限公司 NULL NULL 100595 东莞利丰商标制造有限公司
4 39150000101   100436 晋江市绿雨彩色印刷有限公司 NULL NULL NULL NULL
描述:只显示对应的材料厂编码 不相关的材料厂编码用Y表示(表示对应的已经有其它材料供应商) 为空的材料厂编码用Null表示
假设只拥有材料厂编码100595的查看数据权限 其它材料厂编码不能查看 有其它材料厂编码用Y表示 空的用Null表示
最终结果如下:
ID    材料编码  材料厂编码1     材料厂名称1   材料厂编码2     材料厂名称2    材料厂编码3     材料厂名称3
1 39010000098   100595 东莞利丰商标制造有限公司   Y Y
2 39080000001    Y 100595 东莞利丰商标制造有限公司 Null
3 39150000101    Y   Null 100595 东莞利丰商标制造有限公司
*/
DECLARE @cVenValue VARCHAR(50)   --定义材料厂编码 
SET @cVenValue = '100595';       --只允许查看100595的材料厂编码
WITH T1 AS   --对三个材料厂编码进行列转行
(SELECT CIQuotesID,cSubInvCode,cVenValue,VenIndex = REPLACE(cVen,'cVen','') FROM TmpTCIQuote
UNPIVOT (cVenValue FOR cVen IN (cVen1,cVen2,cVen3)) cVen),
T2 AS  --显示包括的材料厂编码的信息
(SELECT CIQuotesID,cSubInvCode,cVenValue,VenIndex FROM T1 WHERE cVenValue = @cVenValue),
T3 AS  --显示其它材料厂编码的信息 材料厂编码用Y表示
(SELECT CIQuotesID,cSubInvCode,cVenValue = 'Y',VenIndex FROM T1 WHERE cVenValue <> @cVenValue AND ISNULL(cVenValue,'') <> ''),
T4 AS  --显示空材料厂编码的信息 材料厂编码用N表示
(SELECT CIQuotesID,cSubInvCode,cVenValue = 'N',VenIndex FROM T1 WHERE ISNULL(cVenValue,'') = ''),
T5 AS  --根据主键ID进行关联 
(SELECT t2.CIQuotesID, --材料报价单ID
        t2.cSubInvCode, --材料编码
        t2.cVenValue, --材料厂编码(显示相关的材料厂编码)
        t2.VenIndex, --材料厂编码对应的位置(显示相关的材料厂编码 如三个材料供应商 对应的1,2,3的位置)
        cVenValue2 = t3.cVenValue, --材料厂编码(显示不相关的材料厂编码)
        VenIndex2 = t3.VenIndex, --材料厂编码对应的位置(显示不相关的材料厂编码 如三个材料供应商 对应的1,2,3的位置)
        cVenValue3 = t4.cVenValue, --材料厂编码(显示空的材料厂编码)
        VenIndex3 = t4.VenIndex --材料厂编码对应的位置(显示空的材料厂编码 如三个材料供应商 对应的1,2,3的位置)
 FROM T2 
LEFT JOIN T3 ON t2.CIQuotesID = t3.CIQuotesID   --一定要Left Join 以显示包括的材料厂编码的信息的表为主
LEFT JOIN T4 ON t2.CIQuotesID = t4.CIQuotesID), --一定要Left Join 以显示包括的材料厂编码的信息的表为主
T6 AS --对包括的材料厂编码、其它的材料厂编码和空材料厂编码进行行转列的操作
(SELECT CIQuotesID, --材料报价单ID
       cSubInvCode, --材料编码
       cVenA1 = MAX(CASE WHEN VenIndex = 1 THEN cVenValue END), --材料厂编码1(显示相关的材料厂编码)
       cVenB1 = MAX(CASE WHEN VenIndex2 = 1 THEN cVenValue2 END), --材料厂编码1(显示不相关的材料厂编码)
       cVenC1 = MAX(CASE WHEN VenIndex3 = 1 THEN cVenValue3 END), --材料厂编码1(显示空的材料厂编码)
       cVenA2 = MAX(CASE WHEN VenIndex = 2 THEN cVenValue END), --材料厂编码2(显示相关的材料厂编码)
       cVenB2 = MAX(CASE WHEN VenIndex2 = 2 THEN cVenValue2 END), --材料厂编码2(显示不相关的材料厂编码)
       cVenC2 = MAX(CASE WHEN VenIndex3 = 2 THEN cVenValue3 END), --材料厂编码2(显示空的材料厂编码)
       cVenA3 = MAX(CASE WHEN VenIndex = 3 THEN cVenValue END), --材料厂编码3(显示相关的材料厂编码)
       cVenB3 = MAX(CASE WHEN VenIndex2 = 3 THEN cVenValue2 END), --材料厂编码3(显示不相关的材料厂编码)
       cVenC3 = MAX(CASE WHEN VenIndex3 = 3 THEN cVenValue3 END) --材料厂编码3(显示空的材料厂编码)
FROM T5 
GROUP BY CIQuotesID,cSubInvCode),
T7 AS 
(SELECT CIQuotesID, --材料报价单ID
cSubInvCode, --材料编码
       cVen1 = CASE     --材料厂编码(对应的材料厂编码、其它的材料厂编码和空材料厂编码 一定会有一个有存在 另外两个相关的都为空) 
WHEN LEN(ISNULL(cVenA1,'')) > LEN(ISNULL(cVenB1,'')) AND LEN(ISNULL(cVenA1,'')) > LEN(ISNULL(cVenC1,'')) THEN cVenA1
WHEN LEN(ISNULL(cVenB1,'')) > LEN(ISNULL(cVenA1,'')) AND LEN(ISNULL(cVenB1,'')) > LEN(ISNULL(cVenC1,'')) THEN cVenB1
WHEN LEN(ISNULL(cVenC1,'')) > LEN(ISNULL(cVenA1,'')) AND LEN(ISNULL(cVenC1,'')) > LEN(ISNULL(cVenB1,'')) THEN cVenC1
END,
       cVen2 = CASE --下面的Case判断就只取有值的赋给它对应的材料厂编码1,2,3本身
WHEN LEN(ISNULL(cVenA2,'')) > LEN(ISNULL(cVenB2,'')) AND LEN(ISNULL(cVenA2,'')) > LEN(ISNULL(cVenC2,'')) THEN cVenA2
WHEN LEN(ISNULL(cVenB2,'')) > LEN(ISNULL(cVenA2,'')) AND LEN(ISNULL(cVenB2,'')) > LEN(ISNULL(cVenC2,'')) THEN cVenB2
WHEN LEN(ISNULL(cVenC2,'')) > LEN(ISNULL(cVenA2,'')) AND LEN(ISNULL(cVenC2,'')) > LEN(ISNULL(cVenB2,'')) THEN cVenC2
END,
       cVen3 = CASE 
WHEN LEN(ISNULL(cVenA3,'')) > LEN(ISNULL(cVenB3,'')) AND LEN(ISNULL(cVenA3,'')) > LEN(ISNULL(cVenC3,'')) THEN cVenA3
WHEN LEN(ISNULL(cVenB3,'')) > LEN(ISNULL(cVenA3,'')) AND LEN(ISNULL(cVenB3,'')) > LEN(ISNULL(cVenC3,'')) THEN cVenB3
WHEN LEN(ISNULL(cVenC3,'')) > LEN(ISNULL(cVenA3,'')) AND LEN(ISNULL(cVenC3,'')) > LEN(ISNULL(cVenB3,'')) THEN cVenC3
END
FROM T6)  
SELECT * FROM T7
/*
最终结果如下:
ID    材料编码  材料厂编码1    材料厂编码2  材料厂编码3
1 39010000098 100595 Y Y
2 39080000001 Y 100595 NULL
3 39150000101 Y NULL 100595
*/
posted on
2012-10-24 11:54  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/wuyifu/archive/2012/10/24/2736865.html

你可能感兴趣的文章
空间分析开源库GEOS
查看>>
RQNOJ八月赛
查看>>
前端各种mate积累
查看>>
jQuery 1.7 发布了
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>
name phone email正则表达式
查看>>
721. Accounts Merge
查看>>
OpenCv-Python 图像处理基本操作
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>
redis哨兵集群、docker入门
查看>>
hihoCoder 1233 : Boxes(盒子)
查看>>
团队的绩效评估计划
查看>>
oracle中anyData数据类型的使用实例
查看>>
C++对vector里面的元素排序及取任意重叠区间
查看>>
软件测试——性能测试总结
查看>>
12.4站立会议
查看>>