SQL-标识不同的值,包括表中所有列的计数

SQL-标识不同的值,包括表中所有列的计数,sql,Sql,我希望能够识别不同的值,包括表中每列的值计数 我回顾了- 它向我展示了如何为一个单独的专栏做这件事,效果非常好。然而,我有一个超过600列的表,对每一列进行编码将非常耗时 有没有一种方法可以对我的sql进行编码,这样我就可以为表中的所有列获得相同的结果,而不必单独输入每一列 因此,要使用链接中的示例: personid, msg ------------- 1, 'msg1' 2, 'msg2' 2, 'msg3' 3, 'msg4' 1, 'msg2' 我的结果是: p

我希望能够识别不同的值,包括表中每列的值计数

我回顾了-

它向我展示了如何为一个单独的专栏做这件事,效果非常好。然而,我有一个超过600列的表,对每一列进行编码将非常耗时

有没有一种方法可以对我的sql进行编码,这样我就可以为表中的所有列获得相同的结果,而不必单独输入每一列

因此,要使用链接中的示例:

personid, msg  
-------------
1, 'msg1'  
2, 'msg2'  
2, 'msg3'  
3, 'msg4'  
1, 'msg2' 
我的结果是:

personid, count | msg, count
-----------------------------
1,         2 |       msg1,    1  
2,         2 |       msg2,    2  
3,         1 |       msg3,    1  
_, _         |       msg4,    1  
这可能吗?我试过使用distincts和通配符来实现它,但没有成功


如果不够详细,请道歉,这是我的第一篇帖子,我不是SQL专家,谷歌也没有找到答案。谢谢。

我不确定它是否方便,但您可以这样做:

CREATE TABLE #temp (
    personid int,
    message nvarchar(max)
);
GO

INSERT INTO #temp 
SELECT 1, 'msg1' UNION ALL
SELECT 2, 'msg2' UNION ALL
SELECT 2, 'msg3' UNION ALL
SELECT 3, 'msg4' UNION ALL
SELECT 1, 'msg2';
GO

SELECT 
    isnull(t1.rn, t2.rn) as rn, 
    t1.personid as personid, t1.cnt as personid_cnt, 
    t2.message as message, t2.cnt as message_cnt
FROM
    (SELECT personid, count(*) as cnt, 
        ROW_NUMBER() over (order by personid) as rn 
        FROM #temp GROUP BY personid) t1
    FULL JOIN
    (SELECT message, count(*) as cnt, 
        ROW_NUMBER() over (order by message) as rn 
        FROM #temp GROUP BY message) t2
    ON t1.rn = t2.rn
ORDER BY rn

DROP table #temp;
结果:

rn  personid    personid_cnt    message message_cnt
1   1   2   msg1    1
2   2   2   msg2    2
3   3   1   msg3    1
4   NULL    NULL    msg4    1

您可以使用两个不同的查询获取personid,count as one result和msg,count as one result。我将编写一个快速实用程序,根据表的模式信息将您需要的查询构造并输出为字符串。但是您需要了解数据库类型的模式信息存在的位置。您使用的是哪种数据库管理系统?博士后?神谕