我有一个查询,它返回少量行(通常为2-5行),但返回大量列(数百行)。除了几个地方之外,行基本上是相同的。我想通过隐藏常量列来快速识别它们(例如,我有5个产品,所有这些都花费了3美元,所以成本栏应该被抑制)。是否有一种使用MySQL的优雅方法来做到这一点?如果有帮助的话,大多数列都是数字的。
下面是一个很小的例子:假设我的初始查询返回
col1|col2|col3|col4
1 | x | a | 3.14
1 | x | b | 3.14第1、2和4列是“常量”,而第3列不是。因此,我希望二级查询只返回第3列:
|col3|
| a |
| b |问题是,用大量的常量列手动查找少量的非常数列是相当困难的。
发布于 2017-12-28 23:35:42
正如Evan在他的回答中所指出的,您可以使用动态SQL来确定答案。
作为第一次尝试,我尝试创建一个像这样工作的存储过程:
colList,最初为空字符串colList如前所述,您可以通过取消数据的旋转,然后重新旋转数据来完成相同的任务。
当您取消数据枢轴时,对于结果集中的每一行,您将得到n行(其中n是要删除的候选列数)。这些行应该由唯一标识一行的任何列(完成后需要重新组装行)和两个新列组成:column_name (可消除列的实际名称)和value (来自可消除列的值)。同样,这些数据可能存储在一个临时表中(让我们称之为myUnpivotedResults)。
注意:您必须能够将可消除列的所有值转换为公共类型,同时在最终结果中保留所需的信息;如果不能这样做,此方法将无法工作。
以类似于上面详细描述的另一种方式,我们现在删除了所有只有一个值的列。首先,让我们将我们想要隐藏的column_names放在第二个临时表中:
INSERT INTO myColumnsToHide (column_name, myCount)
SELECT column_name, COUNT(DISTINCT value)
FROM myUnpivotedResults
GROUP BY column_name
HAVING COUNT(DISTINCT value) > 1
;接下来,从未旋转的数据中删除这些列:
DELETE t1
FROM myUnpivotedResults t1
INNER JOIN myColumnsToHide t2 ON (t1.column_name = t2.column_name)
;然后,重新调用数据,只留下一个以上不同值的列。
要了解此处提到的旋转、取消旋转、存储过程或其他概念的信息,请在网站上搜索现有的问题;您应该可以找到大量现有的问题和答案。
https://dba.stackexchange.com/questions/194137
复制相似问题