SQL单表查询,请大神指导。

LuckyBug 2016-03-19 10:15:23
数据表,动态增加 需要得到的动态结果表,行列均需排序,行按照A,B,C…A1,A2,A3,…B1,B2,B3…,C1,C2,C3…列按照甲,乙,丙,丁…
T1 T2 T3 T4 A B C A1 A2 A3 B1 B2 B3 C1 C2 C3
乙 2001C1 C1 2016/3/18 甲 2 2 1 1
乙 2001B B 2016/3/18 乙 1 2 1 1 2
甲 1001A A 2016/3/18 丙 1 2 1 1 2 1
丙 3001C3 C3 2016/3/18 丁 1 1 1 1 1 1
丁 4001B2 B2 2016/3/18
丙 5001A2 A2 2016/3/18
甲 1001C1 C1 2016/3/18
乙 2001A1 A1 2016/3/18
丁 4001C2 C2 2016/3/18
丙 3001B1 B1 2016/3/18
甲 1001A1 A1 2016/3/18
丙 3001C1 C1 2016/3/18
丁 4001B B 2016/3/18
丙 5001A3 A3 2016/3/18
甲 1001C C 2016/3/18
乙 2001A1 A1 2016/3/18
丁 4001C3 C3 2016/3/18
丙 3001B B 2016/3/18
乙 2001C1 C1 2016/3/18
乙 2001B2 B2 2016/3/18
甲 1001A A 2016/3/18
丙 3001C1 C1 2016/3/18
丁 4001B3 B3 2016/3/18
丙 5001A2 A2 2016/3/18
甲 1001C C 2016/3/18
乙 2001A2 A2 2016/3/18
丁 4001C C 2016/3/18
… … … …
...全文
355 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
LuckyBug 2016-03-21
  • 打赏
  • 举报
回复
引用 14 楼 roy_88 的回复:
加上GROUP BY T3
DECLARE @Sql NVARCHAR(max)
  
SET @Sql='SELECT T1'
 
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
FROM (SELECT T3,ROW_NUMBER()OVER(ORDER BY LEN(T3),T3) AS RN FROM T GROUP BY T3) AS T
ORDER BY RN
 EXEC(@Sql+' FROM T GROUP BY T1')
搞定啦,谢谢版主~辛苦了
LuckyBug 2016-03-21
  • 打赏
  • 举报
回复
引用 13 楼 mingqing6364 的回复:
[quote=引用 11 楼 LuckyBug007 的回复:] [quote=引用 9 楼 mingqing6364 的回复:] [quote=引用 8 楼 LuckyBug007 的回复:] [quote=引用 7 楼 mingqing6364 的回复:] [quote=引用 6 楼 LuckyBug007 的回复:] [quote=引用 5 楼 mingqing6364 的回复:] [quote=引用 4 楼 LuckyBug007 的回复:] [quote=引用 1 楼 roy_88 的回复:]
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3),LEN(T3)

 EXEC(@Sql+' FROM T GROUP BY T1')
版主,这个有些问题,要怎么修改呢?[/quote]

DECLARE @Sql NVARCHAR(max)
 
SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3)
 
 EXEC(@Sql+' FROM T GROUP BY T1')
[/quote] 这个也有问题,上边有个运行不对的图片。[/quote]

DECLARE @S VARCHAR(2000) = (SELECT T3, 'AS ' + T3 AS NOTDO FROM # GROUP BY T3 ORDER BY LEN(T3),T3 FOR XML PATH)
SET @S = REPLACE(@S, '<row><T3>', ',COUNT(CASE T3 WHEN ''')
SET @S = REPLACE(@S, '</T3><NOTDO>', ''' THEN 1 END) ')
SET @S = REPLACE(@S, '</NOTDO></row>', '')
SET @S = LEFT(@S,LEN(@S)-1)
SET @S = 'SELECT T1' + @S + ' FROM # GROUP BY T1 ORDER BY CASE T1 WHEN ''' + '甲' + ''' THEN 1 WHEN ''' + '乙' + ''' THEN 2 WHEN ''' + '丙' + ''' THEN 3 WHEN ''' + '丁' + ''' THEN 4 END'
PRINT @S
EXECUTE(@S)
[/quote] T1列是自动增加的,不限于甲乙丙丁的。[/quote] 汉字的排序是根据拼音字母来的,所以要转换才能精准,你T1自动递增的话,肯定得有个标准出来,是数字还是字符还是别的什么,这样才能正确排序[/quote] 按升序排列就行,就是丙丁甲乙。[/quote]


DECLARE @S VARCHAR(2000) = (SELECT T3, 'AS ' + T3 AS NOTDO FROM # GROUP BY T3 ORDER BY LEN(T3),T3 FOR XML PATH)
SET @S = REPLACE(@S, '<row><T3>', ',COUNT(CASE T3 WHEN ''')
SET @S = REPLACE(@S, '</T3><NOTDO>', ''' THEN 1 END) ')
SET @S = REPLACE(@S, '</NOTDO></row>', '')
SET @S = LEFT(@S,LEN(@S)-1)
SET @S = 'SELECT T1' + @S + ' FROM # GROUP BY T1 ORDER BY T1
PRINT @S
EXECUTE(@S)
[/quote] 谢谢哈,费心了。
mingqing6364 2016-03-20
  • 打赏
  • 举报
回复
引用 4 楼 LuckyBug007 的回复:
[quote=引用 1 楼 roy_88 的回复:]
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3),LEN(T3)

 EXEC(@Sql+' FROM T GROUP BY T1')
版主,这个有些问题,要怎么修改呢?[/quote]

DECLARE @Sql NVARCHAR(max)
 
SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3)
 
 EXEC(@Sql+' FROM T GROUP BY T1')
LuckyBug 2016-03-20
  • 打赏
  • 举报
回复
引用 5 楼 mingqing6364 的回复:
[quote=引用 4 楼 LuckyBug007 的回复:] [quote=引用 1 楼 roy_88 的回复:]
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3),LEN(T3)

 EXEC(@Sql+' FROM T GROUP BY T1')
版主,这个有些问题,要怎么修改呢?[/quote]

DECLARE @Sql NVARCHAR(max)
 
SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3)
 
 EXEC(@Sql+' FROM T GROUP BY T1')
[/quote] 这个也有问题,上边有个运行不对的图片。
LuckyBug 2016-03-20
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3),LEN(T3)

 EXEC(@Sql+' FROM T GROUP BY T1')
版主,这个有些问题,要怎么修改呢?
LuckyBug 2016-03-20
  • 打赏
  • 举报
回复


版主,运行时出现问题了,这个错误要怎么改呢?
中国风 2016-03-20
  • 打赏
  • 举报
回复
加上GROUP BY T3
DECLARE @Sql NVARCHAR(max)
  
SET @Sql='SELECT T1'
 
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
FROM (SELECT T3,ROW_NUMBER()OVER(ORDER BY LEN(T3),T3) AS RN FROM T GROUP BY T3) AS T
ORDER BY RN
 EXEC(@Sql+' FROM T GROUP BY T1')
mingqing6364 2016-03-20
  • 打赏
  • 举报
回复
引用 11 楼 LuckyBug007 的回复:
[quote=引用 9 楼 mingqing6364 的回复:] [quote=引用 8 楼 LuckyBug007 的回复:] [quote=引用 7 楼 mingqing6364 的回复:] [quote=引用 6 楼 LuckyBug007 的回复:] [quote=引用 5 楼 mingqing6364 的回复:] [quote=引用 4 楼 LuckyBug007 的回复:] [quote=引用 1 楼 roy_88 的回复:]
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3),LEN(T3)

 EXEC(@Sql+' FROM T GROUP BY T1')
版主,这个有些问题,要怎么修改呢?[/quote]

DECLARE @Sql NVARCHAR(max)
 
SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3)
 
 EXEC(@Sql+' FROM T GROUP BY T1')
[/quote] 这个也有问题,上边有个运行不对的图片。[/quote]

DECLARE @S VARCHAR(2000) = (SELECT T3, 'AS ' + T3 AS NOTDO FROM # GROUP BY T3 ORDER BY LEN(T3),T3 FOR XML PATH)
SET @S = REPLACE(@S, '<row><T3>', ',COUNT(CASE T3 WHEN ''')
SET @S = REPLACE(@S, '</T3><NOTDO>', ''' THEN 1 END) ')
SET @S = REPLACE(@S, '</NOTDO></row>', '')
SET @S = LEFT(@S,LEN(@S)-1)
SET @S = 'SELECT T1' + @S + ' FROM # GROUP BY T1 ORDER BY CASE T1 WHEN ''' + '甲' + ''' THEN 1 WHEN ''' + '乙' + ''' THEN 2 WHEN ''' + '丙' + ''' THEN 3 WHEN ''' + '丁' + ''' THEN 4 END'
PRINT @S
EXECUTE(@S)
[/quote] T1列是自动增加的,不限于甲乙丙丁的。[/quote] 汉字的排序是根据拼音字母来的,所以要转换才能精准,你T1自动递增的话,肯定得有个标准出来,是数字还是字符还是别的什么,这样才能正确排序[/quote] 按升序排列就行,就是丙丁甲乙。[/quote]


DECLARE @S VARCHAR(2000) = (SELECT T3, 'AS ' + T3 AS NOTDO FROM # GROUP BY T3 ORDER BY LEN(T3),T3 FOR XML PATH)
SET @S = REPLACE(@S, '<row><T3>', ',COUNT(CASE T3 WHEN ''')
SET @S = REPLACE(@S, '</T3><NOTDO>', ''' THEN 1 END) ')
SET @S = REPLACE(@S, '</NOTDO></row>', '')
SET @S = LEFT(@S,LEN(@S)-1)
SET @S = 'SELECT T1' + @S + ' FROM # GROUP BY T1 ORDER BY T1
PRINT @S
EXECUTE(@S)
LuckyBug 2016-03-20
  • 打赏
  • 举报
回复
引用 10 楼 roy_88 的回复:
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'

SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
FROM (SELECT T3,ROW_NUMBER()OVER(ORDER BY LEN(T3),T3) AS RN FROM T) AS T
ORDER BY RN
EXEC(@Sql+' FROM T GROUP BY T1')


改改,测试一下结果对不





版主,这个行重复了,怎么改呢?
LuckyBug 2016-03-20
  • 打赏
  • 举报
回复
引用 9 楼 mingqing6364 的回复:
[quote=引用 8 楼 LuckyBug007 的回复:] [quote=引用 7 楼 mingqing6364 的回复:] [quote=引用 6 楼 LuckyBug007 的回复:] [quote=引用 5 楼 mingqing6364 的回复:] [quote=引用 4 楼 LuckyBug007 的回复:] [quote=引用 1 楼 roy_88 的回复:]
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3),LEN(T3)

 EXEC(@Sql+' FROM T GROUP BY T1')
版主,这个有些问题,要怎么修改呢?[/quote]

DECLARE @Sql NVARCHAR(max)
 
SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3)
 
 EXEC(@Sql+' FROM T GROUP BY T1')
[/quote] 这个也有问题,上边有个运行不对的图片。[/quote]

DECLARE @S VARCHAR(2000) = (SELECT T3, 'AS ' + T3 AS NOTDO FROM # GROUP BY T3 ORDER BY LEN(T3),T3 FOR XML PATH)
SET @S = REPLACE(@S, '<row><T3>', ',COUNT(CASE T3 WHEN ''')
SET @S = REPLACE(@S, '</T3><NOTDO>', ''' THEN 1 END) ')
SET @S = REPLACE(@S, '</NOTDO></row>', '')
SET @S = LEFT(@S,LEN(@S)-1)
SET @S = 'SELECT T1' + @S + ' FROM # GROUP BY T1 ORDER BY CASE T1 WHEN ''' + '甲' + ''' THEN 1 WHEN ''' + '乙' + ''' THEN 2 WHEN ''' + '丙' + ''' THEN 3 WHEN ''' + '丁' + ''' THEN 4 END'
PRINT @S
EXECUTE(@S)
[/quote] T1列是自动增加的,不限于甲乙丙丁的。[/quote] 汉字的排序是根据拼音字母来的,所以要转换才能精准,你T1自动递增的话,肯定得有个标准出来,是数字还是字符还是别的什么,这样才能正确排序[/quote] 按升序排列就行,就是丙丁甲乙。
中国风 2016-03-20
  • 打赏
  • 举报
回复
DECLARE @Sql NVARCHAR(max)
 
SET @Sql='SELECT T1'

SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
FROM (SELECT T3,ROW_NUMBER()OVER(ORDER BY LEN(T3),T3) AS RN FROM T) AS T
ORDER BY RN
 EXEC(@Sql+' FROM T GROUP BY T1')
改改,测试一下结果对不
mingqing6364 2016-03-20
  • 打赏
  • 举报
回复
引用 8 楼 LuckyBug007 的回复:
[quote=引用 7 楼 mingqing6364 的回复:] [quote=引用 6 楼 LuckyBug007 的回复:] [quote=引用 5 楼 mingqing6364 的回复:] [quote=引用 4 楼 LuckyBug007 的回复:] [quote=引用 1 楼 roy_88 的回复:]
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3),LEN(T3)

 EXEC(@Sql+' FROM T GROUP BY T1')
版主,这个有些问题,要怎么修改呢?[/quote]

DECLARE @Sql NVARCHAR(max)
 
SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3)
 
 EXEC(@Sql+' FROM T GROUP BY T1')
[/quote] 这个也有问题,上边有个运行不对的图片。[/quote]

DECLARE @S VARCHAR(2000) = (SELECT T3, 'AS ' + T3 AS NOTDO FROM # GROUP BY T3 ORDER BY LEN(T3),T3 FOR XML PATH)
SET @S = REPLACE(@S, '<row><T3>', ',COUNT(CASE T3 WHEN ''')
SET @S = REPLACE(@S, '</T3><NOTDO>', ''' THEN 1 END) ')
SET @S = REPLACE(@S, '</NOTDO></row>', '')
SET @S = LEFT(@S,LEN(@S)-1)
SET @S = 'SELECT T1' + @S + ' FROM # GROUP BY T1 ORDER BY CASE T1 WHEN ''' + '甲' + ''' THEN 1 WHEN ''' + '乙' + ''' THEN 2 WHEN ''' + '丙' + ''' THEN 3 WHEN ''' + '丁' + ''' THEN 4 END'
PRINT @S
EXECUTE(@S)
[/quote] T1列是自动增加的,不限于甲乙丙丁的。[/quote] 汉字的排序是根据拼音字母来的,所以要转换才能精准,你T1自动递增的话,肯定得有个标准出来,是数字还是字符还是别的什么,这样才能正确排序
LuckyBug 2016-03-20
  • 打赏
  • 举报
回复
引用 7 楼 mingqing6364 的回复:
[quote=引用 6 楼 LuckyBug007 的回复:] [quote=引用 5 楼 mingqing6364 的回复:] [quote=引用 4 楼 LuckyBug007 的回复:] [quote=引用 1 楼 roy_88 的回复:]
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3),LEN(T3)

 EXEC(@Sql+' FROM T GROUP BY T1')
版主,这个有些问题,要怎么修改呢?[/quote]

DECLARE @Sql NVARCHAR(max)
 
SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3)
 
 EXEC(@Sql+' FROM T GROUP BY T1')
[/quote] 这个也有问题,上边有个运行不对的图片。[/quote]

DECLARE @S VARCHAR(2000) = (SELECT T3, 'AS ' + T3 AS NOTDO FROM # GROUP BY T3 ORDER BY LEN(T3),T3 FOR XML PATH)
SET @S = REPLACE(@S, '<row><T3>', ',COUNT(CASE T3 WHEN ''')
SET @S = REPLACE(@S, '</T3><NOTDO>', ''' THEN 1 END) ')
SET @S = REPLACE(@S, '</NOTDO></row>', '')
SET @S = LEFT(@S,LEN(@S)-1)
SET @S = 'SELECT T1' + @S + ' FROM # GROUP BY T1 ORDER BY CASE T1 WHEN ''' + '甲' + ''' THEN 1 WHEN ''' + '乙' + ''' THEN 2 WHEN ''' + '丙' + ''' THEN 3 WHEN ''' + '丁' + ''' THEN 4 END'
PRINT @S
EXECUTE(@S)
[/quote] T1列是自动增加的,不限于甲乙丙丁的。
mingqing6364 2016-03-20
  • 打赏
  • 举报
回复
引用 6 楼 LuckyBug007 的回复:
[quote=引用 5 楼 mingqing6364 的回复:] [quote=引用 4 楼 LuckyBug007 的回复:] [quote=引用 1 楼 roy_88 的回复:]
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3),LEN(T3)

 EXEC(@Sql+' FROM T GROUP BY T1')
版主,这个有些问题,要怎么修改呢?[/quote]

DECLARE @Sql NVARCHAR(max)
 
SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3)
 
 EXEC(@Sql+' FROM T GROUP BY T1')
[/quote] 这个也有问题,上边有个运行不对的图片。[/quote]

DECLARE @S VARCHAR(2000) = (SELECT T3, 'AS ' + T3 AS NOTDO FROM # GROUP BY T3 ORDER BY LEN(T3),T3 FOR XML PATH)
SET @S = REPLACE(@S, '<row><T3>', ',COUNT(CASE T3 WHEN ''')
SET @S = REPLACE(@S, '</T3><NOTDO>', ''' THEN 1 END) ')
SET @S = REPLACE(@S, '</NOTDO></row>', '')
SET @S = LEFT(@S,LEN(@S)-1)
SET @S = 'SELECT T1' + @S + ' FROM # GROUP BY T1 ORDER BY CASE T1 WHEN ''' + '甲' + ''' THEN 1 WHEN ''' + '乙' + ''' THEN 2 WHEN ''' + '丙' + ''' THEN 3 WHEN ''' + '丁' + ''' THEN 4 END'
PRINT @S
EXECUTE(@S)
中国风 2016-03-19
  • 打赏
  • 举报
回复
DECLARE @Sql NVARCHAR(max)

SET @Sql='SELECT T1'
SELECT @Sql=@Sql+','+QUOTENAME(T3)+'=ISNULL(RTRIM(SUM(CASE WHEN T3='+QUOTENAME(T3,'''')+' THEN 1 END)),'''')'
 FROM T ORDER BY LEN(T3),LEN(T3)

 EXEC(@Sql+' FROM T GROUP BY T1')

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧