如何存储TSQL查询结果以供以后显示

Pop*_*ops 2 sql t-sql pivot odata

我之前从未使用过TSQL,但我决定无论如何都想在SO 数据转储中使用它.所以这可能是一个新秀问题.我确实试图寻找答案,但我不知道我正在尝试做什么的技术术语,如果你没有合适的关键词,那么搜索就会很好.

我的目标是找出有多少问题得分为0,有多少得分为1,有多少得分为2,&c.我可以写一个查询来找出那些个人计数,没问题.不过,我希望能够运行包含循环的查询.这是我到目前为止所使用的:

DECLARE @counter int
SET @counter = 0
WHILE @counter < 3
BEGIN
    SELECT
        COUNT(*)
    FROM
        Posts
    WHERE
        PostTypeId = 1
    AND
        Score = @counter

    SET @counter = @counter + 1
END
Run Code Online (Sandbox Code Playgroud)

(编辑:最终目标是从[0,3]扩展到[-100,1000]或任何必要的内容来解决所有现有问题.显然,我的问题是我在循环的每个循环中抓取计数然后没有做任何事情.目前,我得到的结果只是@counter最初设置的数量; 迭代次数无关紧要.是否可以将结果存储在某处,然后显示为:

+-------+--------------------------------+
| Score | NumberOfQuestionsWithThatScore |
+-------+--------------------------------+
|   -10 |                           111  |
+-------+--------------------------------+
|    -9 |                             0  |
+-------+--------------------------------+
|    -8 |                           248  |
+-------+--------------------------------+
|   ... |                           ...  |
+-------+--------------------------------+

(编辑:任何合理清晰的显示都很好,上表只是一个样本; 编辑2:修改表的设计,以清除持续的混乱)

如果是这样,这叫什么,它是如何完成的?

Gra*_*rdx 6

实际上你可以一次性做到这一点......

SELECT COUNT(*) AS Total, MAX(Score) AS Score
FROM Posts
WHERE PostTypeId = 1 And Score <= 3
Group By Score
Run Code Online (Sandbox Code Playgroud)

这应该给你一个很好的表,如:

Score   Total
0       2490
1       2904
2       2110
Run Code Online (Sandbox Code Playgroud)

疼痛就是袖手旁观,而不是现在在DB前面来验证语法.查看"分组依据"以获得更好的主意.

AS @OMG小马指出这不像你原来的那样.如果要包含单个列,则需要使用SELECT和SUM来执行此操作.

  • 不需要'MAX(得分)`,因为那是'group by`字段. (2认同)

OMG*_*ies 6

您列出的输出是标准数据透视查询,将行转换为列数据:

SELECT SUM(CASE WHEN p.score = 0 THEN 1 ELSE 0 END) AS ScoreOfZero,
       SUM(CASE WHEN p.score = 1 THEN 1 ELSE 0 END) AS ScoreOfOne,
       SUM(CASE WHEN p.score = 2 THEN 1 ELSE 0 END) AS ScoreOfTwo
  FROM POSTS p
Run Code Online (Sandbox Code Playgroud)