Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Baris SQL ke Kolom

Anda tidak dapat melakukannya dengan SQL (kecuali dengan kueri dinamis), kecuali jika Anda mengetahui jumlah kolom (mis. pertanyaan) dalam waktu desain.

Anda harus menarik data yang Anda inginkan dalam format tabel dan kemudian memprosesnya di sisi klien:

SELECT  *
FROM    Question
LEFT OUTER JOIN
        Response
ON      Response.QuestionId = Question.QuestionID

atau, mungkin, ini (dalam SQL Server 2005+ , Oracle 8i+ dan PostgreSQL 8.4+ ):

SELECT  *
FROM    (
        SELECT  q.*, ROW_NUMBER() OVER (ORDER BY questionID) AS rn
        FROM    Question q
        ) q
LEFT OUTER JOIN
        (
        SELECT  r.*, ROW_NUMBER() OVER (PARTITION BY questionID ORDER BY ResponseID) AS rn
        FROM    Response r
        ) r
ON      r.QuestionId = q.QuestionID
        AND q.rn = r.rn
ORDER BY
        q.rn, q.QuestionID

Kueri terakhir akan memberi Anda hasil dalam formulir ini (asalkan Anda memiliki 4 pertanyaan):

rn      question      response
---          ---           ---
1     Question 1  Response 1.1
1     Question 2  Response 2.1
1     Question 3  Response 3.1
1     Question 4  Response 4.1
2     Question 1  Response 1.2
2     Question 2  Response 2.2
2     Question 3  NULL
2     Question 4  Response 4.2
3     Question 1  NULL
3     Question 2  NULL
3     Question 3  Response 3.3
3     Question 4  NULL

, ini dia akan menampilkan data dalam bentuk tabel, dengan rn menandai nomor baris.

Setiap kali Anda melihat rn mengubah pada klien, Anda hanya menutup <tr> dan buka yang baru.

Anda dapat dengan aman meletakkan <td> . Anda satu per baris hasil, karena nomor atau baris yang sama dijamin akan dikembalikan untuk setiap rn

Ini adalah pertanyaan yang cukup sering diajukan.

SQL hanya bukan alat yang tepat untuk mengembalikan data dengan jumlah kolom dinamis.

SQL beroperasi pada himpunan, dan tata letak kolom adalah properti implisit dari suatu himpunan.

Anda harus menentukan tata letak set yang ingin Anda dapatkan dalam waktu desain, sama seperti Anda mendefinisikan tipe data variabel di C .

C bekerja dengan variabel yang didefinisikan secara ketat, SQL bekerja dengan set yang ditentukan secara ketat.

Perhatikan bahwa saya tidak mengatakan itu adalah metode terbaik. Ini hanya cara SQL bekerja.

Pembaruan:

Di SQL Server , Anda dapat menarik tabel dalam HTML formulir langsung dari database:

WITH    a AS
        (
        SELECT  a.*, ROW_NUMBER() OVER (PARTITION BY question_id ORDER BY id) AS rn
        FROM    answer a
        ),
        rows AS (
        SELECT  ROW_NUMBER() OVER (ORDER BY id) AS rn
        FROM    answer a
        WHERE   question_id =
                (
                SELECT  TOP 1 question_id
                FROM    answer a
                GROUP BY
                        question_id
                ORDER BY
                        COUNT(*) DESC
                )
        )
SELECT  (
        SELECT  COALESCE(a.value, '')
        FROM   question q
        LEFT JOIN
                a
        ON      a.rn = rows.rn
                AND a.question_id = q.id
        FOR XML PATH ('td'), TYPE
        ) AS tr
FROM    rows
FOR XML PATH(''), ROOT('table')

Lihat entri ini di blog saya untuk detail lebih lanjut:

  • Pivot dinamis


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan sql nama kolom tidak valid

  2. Periksa Status Semua Pesan Database Database di SQL Server (T-SQL)

  3. Apakah mungkin untuk klausa Output SQL untuk mengembalikan kolom yang tidak dimasukkan?

  4. Sintaks salah di dekat kata kunci 'dengan'...pernyataan sebelumnya harus diakhiri dengan titik koma

  5. SQL Server:pivot dinamis lebih dari 5 kolom