首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐藏在少数行中常量的列

隐藏在少数行中常量的列
EN

Database Administration用户
提问于 2017-12-28 21:32:53
回答 1查看 1.9K关注 0票数 1

我有一个查询,它返回少量行(通常为2-5行),但返回大量列(数百行)。除了几个地方之外,行基本上是相同的。我想通过隐藏常量列来快速识别它们(例如,我有5个产品,所有这些都花费了3美元,所以成本栏应该被抑制)。是否有一种使用MySQL的优雅方法来做到这一点?如果有帮助的话,大多数列都是数字的。

下面是一个很小的例子:假设我的初始查询返回

代码语言:javascript
复制
col1|col2|col3|col4
 1  | x  | a  | 3.14
 1  | x  | b  | 3.14

第1、2和4列是“常量”,而第3列不是。因此,我希望二级查询只返回第3列:

代码语言:javascript
复制
|col3|
| a  |
| b  |

问题是,用大量的常量列手动查找少量的非常数列是相当困难的。

EN

回答 1

Database Administration用户

发布于 2017-12-28 23:35:42

正如Evan在他的回答中所指出的,您可以使用动态SQL来确定答案。

作为第一次尝试,我尝试创建一个像这样工作的存储过程:

  1. 生成完整的结果集,并放入临时表中。
  2. 创建变量colList,最初为空字符串
  3. 对于每一列:
    • 计算不同值的数目
    • 如果计数大于1,则将列名(前面有逗号)添加到colList

  4. 在另一个变量中构建SQL语句: SET stmt = CONCAT( "SELECT id,otherUniqueColumn“,colList,”,trailing_unique_column FROM tmpTable;")
  5. 然后,执行你的陈述。

如前所述,您可以通过取消数据的旋转,然后重新旋转数据来完成相同的任务。

当您取消数据枢轴时,对于结果集中的每一行,您将得到n行(其中n是要删除的候选列数)。这些行应该由唯一标识一行的任何列(完成后需要重新组装行)和两个新列组成:column_name (可消除列的实际名称)和value (来自可消除列的值)。同样,这些数据可能存储在一个临时表中(让我们称之为myUnpivotedResults)。

注意:您必须能够将可消除列的所有值转换为公共类型,同时在最终结果中保留所需的信息;如果不能这样做,此方法将无法工作。

以类似于上面详细描述的另一种方式,我们现在删除了所有只有一个值的列。首先,让我们将我们想要隐藏的column_names放在第二个临时表中:

代码语言:javascript
复制
INSERT INTO myColumnsToHide (column_name, myCount)
SELECT column_name, COUNT(DISTINCT value)
  FROM myUnpivotedResults
 GROUP BY column_name
HAVING COUNT(DISTINCT value) > 1
;

接下来,从未旋转的数据中删除这些列:

代码语言:javascript
复制
DELETE t1
  FROM myUnpivotedResults t1
         INNER JOIN myColumnsToHide t2 ON (t1.column_name = t2.column_name)
;

然后,重新调用数据,只留下一个以上不同值的列。

要了解此处提到的旋转、取消旋转、存储过程或其他概念的信息,请在网站上搜索现有的问题;您应该可以找到大量现有的问题和答案。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/194137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档