2016-04-08 3 views
0

Ich habe Tabellen wieIst es möglich, eine Abfrage mit mehreren dynamischen Pivots zu schreiben?

Partners 
=============== 
id | name 
--------------- 
1 | "John" 
2 | "Jacob" 


    Regions 
==================== 
id | name 
-------------------- 
1 | "Antarctica" 
2 | "Coruscant" 
3 | "Iraq" 

     Destinations 
============================ 
id | partner_id | region_id 
---------------------------- 
1 |  1  | 1 
2 |  1  | 2 
3 |  2  | 2 

    Surveys 
================ 
id | title 
---------------- 
1 | "Part 1" 
2 | "Bonus" 


     Versions 
====================== 
id | title 
---------------------- 
1 | "First Version" 
2 | "Version #2" 


       Permissions 
========================================== 
id | partner_id | survey_id | version_id 
------------------------------------------ 
1 |  1  |  1  |  1 
2 |  1  |  1  |  2 
3 |  2  |  1  |  1 


      Sections 
======================================= 
id | survey_id | title 
--------------------------------------- 
1 | 1  | "Some Section" 
2 | 1  | "Some Other Section" 
3 | 2  | "Yet Another Section" 


     Subsections 
================================= 
id | title | section_id 
-------------------------------- 
1 | "Subsec" |  1 
2 | "Subsecc" |  1 
3 | "Ss"  |  2 
4 | "kasjhja" |  3 
5 | "aslkdjas" |  3 


         Questions 
=================================================================== 
id | subsection_id |    qtext   | version_id 
------------------------------------------------------------------- 
1 |  1  | "What is 1+1?"    |  1 
2 |  1  | "What is 2+2?"    |  1 
3 |  1  | "What is one plus one?"  |  2 
4 |  1  | "What is two plus two?"  |  2 
5 |  2  | "How are you doing?"   |  1 
6 |  2  | "What's up?"     |  2 
7 |  3  | "What would you rate her?" |  1 
8 |  3  | "What would you rate her?" |  2 
9 |  4  | "Number of bits in a byte?" |  1 
10 |  5  | "What year is it?"   |  1 
11 |  5  | "The year is ...."?   |  2 

       Answers 
======================================== 
id | question_id | partner_id | val 
---------------------------------------- 
1 |  1  |  1  | 2 
2 |  1  |  2  | 2 
3 |  2  |  1  | 4 
4 |  2  |  2  | 4 
5 |  3  |  1  | 2 
6 |  4  |  1  | 69 
7 |  5  |  1  | 55 
8 |  6  |  1  | 10 
9 |  7  |  1  | 9 
10 |  8  |  1  | 10 
11 |  9  |  1  | 8 
12 |  10  |  1  | 2016 
13 |  11  |  1  | 2016 


      MarkedAsFinished 
=========================================== 
id | partner_id | survey_id | version_id 
------------------------------------------- 
    1 | 1  | 1  |  1 
    2 | 1  | 2  |  1 
    3 | 1  | 1  |  2 
    4 | 2  | 1  |  1 

wo die PK/FK Beziehungen von meinen Namenskonventionen selbsterklärend sind. Wenn möglich, würde Ich mag eine Abfrage

CREATE PROCEDURE AnswerDump 
    @versid INT 
AS 
    ... 

, das wäre zum Beispiel der folgenden Tabelle zurück, wenn mit versid ausgeführt (entsprechend Versions.id) gleich 1.

name | Destined for Antarctica? | Destined for Coruscant? | Destined for Iraq? | Finished with Part 1? | Finished with Bonus? | Permission to contact about Part 1? | Permission to contact about Bonus? | What is 1+1? | What is 2+2? | How are you doing? | What would you rate her? | Number of bits in a byte? | What year is it? 
============================================================================================================================================================================================================================================================================================================================================= 
"John" |   Yes    |   Yes   |  No   |   Yes   |   Yes   |    Yes     |     No    |  2  |  4  |  55   |    9   |    8    |  2016 
"Jacob" |   No    |   Yes   |  No   |   Yes   |   No   |    Yes     |     No    |  2  |  4  |  0   |    0   |    0    |  0 

Also, was es im Grunde tut, ist Partners als Zeilen verwenden und alle anderen zugehörigen Informationen wie Spalten. Sie können sehen, dass es Antworten für Fragen, die noch nicht ausgefüllt wurden, mit Null füllt.

Sorry, wenn dies scheint wie ein „meinen Code schreiben für mich“ Frage, aber ich habe viel Mühe gegeben, es zu schreiben ...

+1

Schön, dass Sie Beiträge verfassen Tabellen mit Beispieldaten, aber http: //sqlfiddle.com wird viel besser sein. Die Konvertierung von Text in ein Skript braucht Zeit. – lad2025

+0

Hier ist ein großartiger Ort, um anzufangen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Dies scheint nicht wie eine schreiben meinen Code für mich Frage - WEIL SIE HABEN KEINE FRAGE. Wenn jedoch Ihre Frage ist, welchen Code ich schreiben soll, dann ist es ein Code für mich schreiben. Also ... was ist deine Frage? – Hogan

Antwort

0

Ja, es ist möglich, aber nicht innerhalb einer SQL-Ansicht, Sie müssen sie in einer SQL-Funktion oder einem SP entwickeln.

Ein Beispiel für einen SQL-Pivot die folgend wäre:

Normaler SQL:

USE AdventureWorks2008R2 ; 
GO 
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost 
FROM Production.Product 
GROUP BY DaysToManufacture; 

Pivot SQL:

-- Pivot table with one row and five columns 
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4] 
FROM 
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable 
PIVOT 
(
AVG(StandardCost) 
FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) 
) AS PivotTable; 
Verwandte Themen