在Teradata中获取列名以及列数据

时间:2017-01-12 04:17:47

标签: sql teradata

基本上我有一张表ABC:

COl1 | Col2 | COl3
---- | ---- | ----
  1  |  a   |  12
  2  |  b   |  11
  1  |  b   |  10

我需要一个类似的答案:

column name | distinct value of the column | number of occurrences
----------- | ---------------------------- | --------------------
col1        | 1                            | 2
col1        | 2                            | 1
col2        | a                            | 1
col2        | b                            | 2
col3        | 10                           | 1
col3        | 11                           | 1
col3        | 12                           | 1

有没有办法用Teradata解决这个问题?

1 个答案:

答案 0 :(得分:0)

对于您的具体示例,您可以执行以下操作:

你基本上为每个列名做一个联合。如果您的值是不同的数据类型,则必须将它们转换为适用于所有值的某种类型。

SELECT ColumnName,DistinctValue, COUNT(*) AS occurrences
FROM
(
SELECT CAST('Col1' AS VARCHAR(4)) AS "ColumnName"
,CAST(Col1 AS VARCHAR(2)) AS "DistinctValue"
FROM ABC
UNION ALL
SELECT CAST('Col2' AS VARCHAR(4)) AS "ColumnName"
,CAST(Col2 AS VARCHAR(2)) AS "DistinctValue"
FROM ABC
UNION ALL
SELECT CAST('Col3' AS VARCHAR(4)) AS "ColumnName"
,CAST(Col3 AS VARCHAR(2)) AS "DistinctValue"
FROM ABC
) MyTable
GROUP BY ColumnName,DistinctValue
ORDER BY ColumnName,DistinctValue

如果您需要获取要在上述查询中使用的列名,您可以执行类似

的操作
HELP TABLE ABC;

Select ColumnName from DBC.ColumnsV  
where Tablename='ABC'  
and DatabaseName='YourDatabaseName';

如果你想要一些适用于任何表的泛型,那么你可能会创建一个存储过程,从DBC.ColumnsV查询列名,然后在动态SQL查询中使用结果。但是,这可能会变得很丑陋(无论是实际编写它还是在对具有大量不同值的巨大表运行它时会发生什么)。