Как сохранить результаты запроса TSQL для последующего отображения - PullRequest
2 голосов
/ 16 сентября 2010

Я никогда раньше не использовал TSQL, но решил, что в любом случае хочу покопаться в SO data dump .Так что это, вероятно, вопрос новичка.Я действительно пытался найти ответ, но я не знаю технического термина для того, что я пытаюсь сделать, и поиск хорош, только если у вас нет правильных ключевых слов.

Мойцель состоит в том, чтобы выяснить, сколько вопросов имеют оценку 0, сколько имеют оценку 1, сколько имеют оценку 2 и т. д.Я могу написать запрос, чтобы узнать эти индивидуальные подсчеты, без проблем.Я хотел бы иметь возможность выполнить запрос, содержащий цикл, хотя.Вот что я использую до сих пор:

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

( РЕДАКТИРОВАТЬ : конечная цель состоит в том, чтобы расширить с [0, 3] до [-100, 1000] или что угодночтобы ответить на все существующие вопросы) Очевидно, моя проблема в том, что я собираю счетчик в каждом цикле цикла, а затем ничего не делаю с ним.В настоящее время результат, который я получаю, это просто счет того, что @counter установлено изначально;количество итераций не имеет значения.Можно ли где-то сохранить результаты, а затем отобразить их как-то так:

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

( РЕДАКТИРОВАТЬ : любой достаточно четкий дисплей в порядке, приведенная выше таблица - просто пример; EDIT 2 : изменен дизайн таблицы, чтобы убрать постоянную путаницу)

Если так, как это называется и как это делается?

Ответы [ 3 ]

6 голосов
/ 16 сентября 2010

Вывод, который вы перечислили, является стандартным сводным запросом, превращающим строки в столбчатые данные:

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
6 голосов
/ 16 сентября 2010

На самом деле вы можете сделать это за один проход ...

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

Это должно дать вам хороший стол, такой как:

Score   Total
0       2490
1       2904
2       2110

Рана болит с манжеты, а не вфронт БД прямо сейчас, чтобы проверить синтаксис.Посмотрите "Группировать по", чтобы получить лучшую идею.

КАК @OMG Ponies указывает, что это не сводится, как вы изначально это делали.Если вы хотите иметь один столбец, вам нужно использовать SELECT и SUM для этого.

1 голос
/ 16 сентября 2010

Пример 1: Это просто конкретное решение, основанное на оригинальной методологии, но содержащее строку для каждого подсчета баллов от минимального до максимального, включая нулевые баллы.

--Posts per score, with zeros.

declare @minScore int
declare @maxScore int
declare @current int
declare @postType int

set @postType = 1

set @minScore = (select MIN(Score) from Posts where PostTypeId = @postType)
set @maxScore = (select MAX(Score) from Posts where PostTypeId = @postType)

set @current = @minScore

create table #myTemp (Score int, PostsCount int) 

insert into #myTemp
select Score, count(*) from Posts group by Score

while @current < @maxScore
begin
  insert into #myTemp
  select @current, 0
    where not exists (select 1 from #myTemp where Score = @current and PostTypeId = @postType)
  set @current = @current + 1
end

select * from #myTemp order by Score
​

Пример 2. Дрянный подход к динамическому SQL с использованием столбцов в качестве оценок, причем каждый столбец является подзапросом. Отказ от ответственности: SEDE, кажется, выполняет все это, но вы не получите результаты. Если вместо этого вы наберете select @dynSQL в конце, а затем запустите его, вы получите данные.

-- Dynamic SQL count of all posts for a score

declare @minScore int
declare @maxScore int
declare @current int
declare @postType int
declare @dynSQL nvarchar(MAX)

set @postType = 1

set @minScore = (select MIN(Score) from Posts where PostTypeId = @postType)
set @maxScore = (select MAX(Score) from Posts where PostTypeId = @postType)

set @current = @minScore

set @dynSQL = 'select '

while @current <= @maxScore
begin
    set @dynSQL = @dynSQL 
                  + '(select count(*) from Posts where PostTypeId = ' 
                  + convert(varchar,@postType) + ' and Score = ' 
                  + convert(varchar,@current) + ') as Score_'
                  + CASE WHEN @current < 0 THEN 'Negative_' 
                              + convert(varchar,ABS(@current)) 
                         ELSE convert(varchar,@current)
                         END
    if @current < @maxScore set @dynSQL = @dynSQL + ', '
    set @current = @current + 1
end

exec(@dynSQL)
​
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...