【SQL】行转列过滤,使用别名和不使用别名的区别用法。
需求为:
仿太平洋网站筛选。
多选类型的字段应采用‘并且’;单选和录入类型的字段应采用‘或者’
比如有如下选项:
| 参数头 | 参数体 | |
| 操作系统(多选) | win7 | win8 |
| 运行内存(单选) | 2G | 4G |
商品库存在有3个商品,分别为:
lenovoB111,操作系统:win7、win8,运行内存:2G
lenovoB222,操作系统:win7、win8,运行内存:4G
lenovoB333:操作系统:win10,运行内存4G
那这个时候,我吧上面的选项win7、win8、2G、4G全部勾选后,点击商品筛选按钮,生成的筛选条件应该为:
win7、win8、2G
win7、win8、4G
符合这两个筛选条件的商品将会给筛选出来,即(lenovo111&lenovo222这两台电脑)
简洁表结构为:
参数头:
| id | name | type |
参数体:
| id | name | titleId |
商品参数组成:
| id | product_id | param_item_id |
模拟参数组成记录(省略id):
(标识下以上商品对应属性id
商品:
电脑的对应id号:lenovo111:1,lenovo222:2,lenovo333:3
参数:
操作系统对应id:win7:1,win8:2,win10:3
内存对应id:2G:4,4G:5
)
| product_id | product_param_item_id |
| 1 | 1 |
| 1 | 2 |
| 1 | 4 |
| 2 | 1 |
| 2 | 2 |
| 2 | 5 |
| 3 | 3 |
| 3 | 5 |
通过预想最后结果应该为1、2
查询语句(使用列转行,使结果变成以下):
| product_id | product_param_item_id |
| 1 | 1,2,4 |
| 2 | 1,2,5 |
| 3 | 3,5 |
--因为t.c不可以用,所以使用子查询
select t2.product_id,t2.c from (
select t.product_id,to_char(wmsys.wm_concat(t.product_param_item_id)) c from T_EB_PRODUCT_PARAM_COMPOSE t
group by t.product_id) t2
where 1=1 and
(',' || t2.c || ',' like '%,1,%') and
(',' || t2.c || ',' like '%,2,%') and
(',' || t2.c || ',' like '%,4,%')
or
(',' || t2.c || ',' like '%,1,%') and
(',' || t2.c || ',' like '%,2,%') and
(',' || t2.c || ',' like '%,5,%');
--直接使用having过滤
select t.product_id from T_EB_PRODUCT_PARAM_COMPOSE t
group by t.product_id
having 1=1 and
(',' || t2.c || ',' like '%,1,%') and
(',' || t2.c || ',' like '%,2,%') and
(',' || t2.c || ',' like '%,4,%')
or
(',' || t2.c || ',' like '%,1,%') and
(',' || t2.c || ',' like '%,2,%') and
(',' || t2.c || ',' like '%,5,%');
【SQL】行转列过滤,使用别名和不使用别名的区别用法。的更多相关文章
- SQL 行转列和列转行
SQL 行转列和列转行 行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过 ...
- Ms sql行转列。汇总
SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 ...
- sql 行专列 列转行 普通行列转换
转载:http://www.cnblogs.com/newwind521/archive/2010/11/25/1887203.html sql 行专列 列转行 普通行列转换 /* 标题:普通行列转换 ...
- sql 行转列 PIVOT 列转行 UNPIVOT
原文:sql 行转列 PIVOT 列转行 UNPIVOT 一: 现有表一(t_table1),想转为表二(t_table2)的格式. 表一: 年 公司 收入 2013 公司1 12 2013 公司2 ...
- sql 行转列总结
原文:sql 行转列总结 PIVOT UNPIVOT的用法 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- SQL行转列 (及EAV模型获取数据)
参考文章: http://www.williamsang.com/archives/1508.html 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列. ...
- SQL行转列,列转行
SQL 行转列,列转行 行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧. 行列转换就是如下图所示两种展示形式的互相转换 行转列 假如我们有下表: SELECT * FROM s ...
- sql 行转 列, 列转行
行列互转 复制代码 create table test(id ),quarter int,profile int) insert into test values(,,) insert into te ...
- SQL行转列和列转行
行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过了,却没有系统性的认识和 ...
- Sql 行转列问题总结
行转列问题总结 1.行转列 ---1.最简单的行转列/* 问题:假设有张学生成绩表(tb)如下:姓名 课程 分数张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物 ...
随机推荐
- 1.4. chromium源代码分析 - chromiumframe - 消息系列
Message framework 是对消息循环的封装和扩展,Chromium在消息循环中增加处理内部任务的工作.将内部工作处理寄生在Windows的消息循环中,会有一个问题,就是没有Windows自 ...
- HDU 2087 剪花布条(模式串在主串中出现的次数主串中子串不可重叠)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 题意:求模式串在主串中出现的次数,与模式串匹配的子串之间不可重叠. 思路:用kmp算法解决,在匹 ...
- BZOJ 3156: 防御准备( dp + 斜率优化 )
dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...
- C#读取网页
public bool getweb(string strURL,out string buf) { buf=""; try { //Uri url=new Uri(strURL, ...
- 哈希长度扩展攻击的简介以及HashPump安装使用方法
哈希长度扩展攻击(hash length extension attacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段.该攻击适用于在消息与密钥的长度已知的情形下,所有采取了 H(密钥 ∥ ...
- javascript closure 闭包 事件绑定
先来一个基本的例子 <!-- 实现一段脚本,使得点击对应链接alert出相应的编号 --> <meta http-equiv="Content-Type" con ...
- 一个高效过滤非UTF8字符的C函数(也可用来判断是否utf8)
/* UTF-8 valid format list: 0xxxxxxx 110xxxxx 10xxxxxx 1110xxxx 10xxxxxx 10xxxxxx 11110xxx 10xxxxxx ...
- Session()
如何使用 Session Java Api 只给我们一种方式来 获取 当前会话相关的 session: HttpSession session = request.getSession(); //或 ...
- android 大小写转换
private void toUpperCase(byte[] data, int start, int len) { int end = start + len; int dist = 'A' - ...
- C++模板:qsort
void qsort(int l,int r){ int i,j,t,mid; mid=b[(l+r)>>1]; i=l; j=r; do{ while (b[i]<mid) i++ ...