SQL-标识不同的值,包括表中所有列的计数
我希望能够识别不同的值,包括表中每列的值计数 我回顾了- 它向我展示了如何为一个单独的专栏做这件事,效果非常好。然而,我有一个超过600列的表,对每一列进行编码将非常耗时 有没有一种方法可以对我的sql进行编码,这样我就可以为表中的所有列获得相同的结果,而不必单独输入每一列 因此,要使用链接中的示例:SQL-标识不同的值,包括表中所有列的计数,sql,Sql,我希望能够识别不同的值,包括表中每列的值计数 我回顾了- 它向我展示了如何为一个单独的专栏做这件事,效果非常好。然而,我有一个超过600列的表,对每一列进行编码将非常耗时 有没有一种方法可以对我的sql进行编码,这样我就可以为表中的所有列获得相同的结果,而不必单独输入每一列 因此,要使用链接中的示例: personid, msg ------------- 1, 'msg1' 2, 'msg2' 2, 'msg3' 3, 'msg4' 1, 'msg2' 我的结果是: p
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。我将编写一个快速实用程序,根据表的模式信息将您需要的查询构造并输出为字符串。但是您需要了解数据库类型的模式信息存在的位置。您使用的是哪种数据库管理系统?博士后?神谕