sql >> Databáze >  >> RDS >> Sqlserver

SQL dotaz pro zobrazení dat db

Hledáte kontingenční data – změňte sloupcová data na řádky. Starou školou je použití CASE příkazy – od SQL Server 2005 můžete použít PIVOT příkaz. Poskytnutí příkladu PIVOT nechám na někom jiném.

SELECT t.memberid,
       CASE WHEN t.questionno = 1 THEN t.answerno ELSE NULL END AS 1,
       CASE WHEN t.questionno = 2.1 THEN t.answerno ELSE NULL END AS 2.1,
       CASE WHEN t.questionno = 2.2 THEN t.answerno ELSE NULL END AS 2.2,
       CASE WHEN t.questionno = 3 THEN t.answerno ELSE NULL END AS 3
       CASE WHEN t.questionno = 5 THEN t.answerno ELSE NULL END AS 5
       CASE WHEN t.questionno = 7 THEN t.answerno ELSE NULL END AS 7
  FROM ANSWER t

Není mi jasné, jaký je datový typ sloupce questionno, v případě potřeby jej aktualizujte.

Pokud mohou uživatelé definovat své vlastní otázky, musíte použít dynamické SQL . Nejprve budete muset získat seznam čísel otázek a poté na základě těchto výsledků vytvořit příkazy CASE. Stejně tak pro PIVOT...

DECLARE @SQL nvarchar(4000)
DECLARE @questionno [data type here]

SET @SQL = 'SELECT t.memberid,'

DECLARE c1 CURSOR READ_ONLY FOR
  SELECT t.questionno
    FROM ANSWER t
GROUP BY t.questionno
ORDER BY t.questionno

OPEN c1

FETCH NEXT FROM c1 INTO @questionno 

WHILE @@FETCH_STATUS = 0
BEGIN

  SET @SQL = @SQL + ' CASE WHEN t.questionno = '+ @questionno +' THEN t.answerno ELSE NULL END AS '+ @questionno','

  FETCH NEXT FROM c1 INTO @questionno 
END

CLOSE c1
DEALLOCATE c1

SET @SQL = @SQL + 'NULL FROM ANSWER t '

EXEC(@SQL)

NULL FROM ... je to proto, že jsem příliš líný zbavit se čárky, která by pocházela z posledního příkazu CASE.



  1. Mohu se připojit k serveru SQL, který je mimo moji síť?

  2. Jak používat alias název sloupce v klauzuli where v SQL Server

  3. Co je DATALENGTH() v SQL Server?

  4. SQL DROP TABLE omezení cizího klíče