2014-03-06 3 views
0

그래서 원하는 값은 distinct이고 그 값은 count입니다. 기본적으로 나는 다음과 같이 할 : 내가 사용하는 단일 테이블에 대한SQL은 여러 테이블의 열에 대해 고유 한 수를 계산합니다.

DistinctValue | Count 
Bob   | 4 
Fred   | 5 
George  | 2 
Joeseph  | 1 

:

SELECT ColumnName, COUNT(*) from TableName group by Column 

내가 이런 짓을 했을까하는 방법은 여러 테이블에 걸쳐 할 수 있도록. 나는이 일을하기 위해 필요한 테이블 30 개 정도, 아마도 더 많은 테이블을 가지고있다.

도움을 주시면 감사하겠습니다. 필요한 정보가 더 있으면 알려주세요. 아, 그리고 모든 테이블에 동일한 열 이름이 있으므로 열 이름에 대해 걱정할 필요가 없습니다.

+0

어떤 DBMS를 사용하고 있습니까? 포스트그레스? 신탁? –

+0

@a_horse_with_no_name 하나의 데이터베이스에는 SQL Server 2008 R2를 사용하고 다른 데이터베이스에는 SQL Server 2012를 사용하고 있습니다. – shadonar

+0

모든 테이블에서 동일한 열 이름입니까? – DMason

답변

1
WITH mytbl AS (
SELECT ColumnName, COUNT(*) AS myCount from TableName group by Column 
UNION ALL 
SELECT ColumnName, COUNT(*) from TableName2 group by Column 
... a union all for every table 
) 

SELECT ColumnName, SUM(myCount) 
FROM mytbl 
GROUP BY ColumnName 

- 이전 버전의 MS SQL을 사용하는 경우 UNION 문을 큰 하위 선택 또는 테이블 변수에 넣을 수 있습니다.
- IE, 그들은 CTE

+0

"* 이전 버전의 SQL *"- SQL은 쿼리 언어이며 ** DBMS 제품이 아닙니다. –

0
SELECT 
    t.name, 
    count(c.name) as columnsname 
FROM 
    sys.tables t 
    inner join sys.columns c 
    ON t.object_id = c.object_id 
group by t.name 
+0

이 작업을 수행하는 데 문제가 있습니다. 나 한테 간단히 설명해 줄래? – shadonar

0

에서 노동 조합과 하단 쿼리에서 mytbl를 대체 할 마지막 쿼리에서 mytbl의 자리를 차지할 것 당신은 얻을 동적 TSQL을 생성하고 실행해야합니다 당신의 검색 결과 :

DECLARE @Tsql NVARCHAR(MAX) = '' 
DECLARE @ColumnName SYSNAME = 'YourColumnName' 

SELECT @Tsql = @Tsql + 'SELECT ''[' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + ']'' AS TableName, ' + 
    '[' + @ColumnName + '], COUNT(*) AS RecordCount FROM [' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + '] GROUP BY [' + @ColumnName + '] UNION ' + CHAR(13) + CHAR(10) 
FROM INFORMATION_SCHEMA.COLUMNS c 
JOIN INFORMATION_SCHEMA.TABLES t 
    ON t.TABLE_SCHEMA = c.TABLE_SCHEMA 
    AND t.TABLE_NAME = c.TABLE_NAME 
    --Comment out the next line if you want data/counts for views too. 
    AND t.TABLE_TYPE = 'BASE TABLE' 
WHERE c.COLUMN_NAME = @ColumnName 

--Remove the last UNION (and carriage-return, line-feed) 
SELECT @Tsql = LEFT(@Tsql, LEN(@Tsql) - 8) 

--Verify query. 
PRINT @Tsql 

--Uncomment when ready to proceed. 
--EXEC (@Tsql)