Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie SQL do wyświetlenia danych db

Chcesz przestawić dane — zmień dane kolumnowe na wiersze. Stara szkoła polega na użyciu CASE oświadczenia - od SQL Server 2005 można użyć OBRÓT Komenda. Zostawię to komuś innemu, aby dostarczył przykład PIVOT.

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

Nie jest dla mnie jasne, jaki jest typ danych kolumny pytania, zaktualizuj w razie potrzeby.

Jeśli użytkownicy mogą definiować własne pytania, musisz użyć dynamicznego SQL . Musisz najpierw uzyskać listę pytań, a następnie skonstruować instrukcje CASE na podstawie tych wyników. Podobnie dla 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 ... ponieważ jestem zbyt leniwy, aby pozbyć się przecinka, który pochodziłby z ostatniego wyrażenia CASE.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2012:rozbieżności DATETIME między wstawkami a wyzwalaczami

  2. operacja niedozwolona, ​​gdy obiekt jest zamknięty podczas uruchamiania bardziej zaawansowanego zapytania

  3. Jaki jest najlepszy sposób tworzenia i wypełniania tabeli liczb?

  4. Wykonaj INSERT z SELECT, aby wstawić wiele rekordów

  5. Jak naprawić błąd „Dostawca nazwanych potoków, błąd 40 — nie można otworzyć połączenia z serwerem SQL Server”?