Ich habe die folgende Tabelle, die ich zusammenfassen muss
ID A B C D E F G
----------------------------------
1-100 1 2 1 1 1 1 1
1-201 1 2 1 2 2 2 2
1-322 1 1 1 1 2 2 1
2-155 1 1 2 1 1 2 2
2-167 2 1 2 1 2 1 2
2-389 2 2 1 2 1 1 2
2-423 1 2 2 2 1 1 1
3-10 2 1 1 1 2 2 2
3-222 1 1 1 1 2 2 1
3-397 2 1 1 2 2 1 1
In der obigen Tabelle sind die Werte 1 als S und 2 als R kodiert. Außerdem ist die ID ein Code wie XX, YY oder XX, wobei die Ziffer vor dem - für XX, YY oder XX steht.
Die Zusammenfassung, die ich mir wünsche, lautet wie folgt
XX YY ZZ
------------------------------------------
A S 3 100% 2 50% 1 33%
R 0 0% 2 50% 2 66%
B S 2 66% 2 50% 3 100%
R 1 33% 2 50% 0 0%
C S 3 100% 3 75% 3 100%
R 0 0% 1 25% 0 0%
D S 2 66% 2 50% 2 66%
R 1 33% 2 50% 1 33%
E S 1 33% 3 75% 0 0%
R 2 66% 1 25% 3 100%
F S 1 33% 3 75% 2 66%
R 2 66% 1 25% 1 33%
G S 2 66% 1 25% 1 33%
R 1 33% 3 75% 2 66%
Ich muss also die Tabelle drehen, die 1/2 zählen und Prozentsätze erstellen.
Das hat mich ziemlich verwirrt, und ich bin in einige Sackgassen geraten, wie man das macht (geschweige denn, wie man es elegant macht)
Vielen Dank im Voraus!
Mit Martins Hilfe bin ich dem Ziel schon sehr nahe. Meine Daten sind natürlich ein bisschen verrückter als das Beispiel, das ich gegeben habe, also habe ich immer noch Schwierigkeiten. Ich habe die Daten zensiert und die richtigen Kodierungen eingefügt, die ich haben möchte - ja, die Kodierungen sind wirklich doof, ich habe keine Kontrolle über sie :)
Ich habe Martins SQL erweitert, um eine Verbindung zu meinen Daten herzustellen, aber es gibt noch zwei Probleme. Die Reihenfolge der Zeilen in der Thing-Spalte ist nicht ganz das, was ich will.
Wenn ich den folgenden Code ausprobiere, erhalte ich die Meldung "Must declare the scalar variable @order" - die Verknüpfung mit meiner temporären Tabelle namens myOrder wird nicht akzeptiert.
DECLARE @myOrder TABLE (rug varchar(3), rugOrder int)
INSERT @myOrder
SELECT 'INH', 1 UNION ALL
SELECT 'RIF', 2 UNION ALL
SELECT 'KM', 3 UNION ALL
SELECT 'AK', 4 UNION ALL
SELECT 'CM', 5 UNION ALL
SELECT 'MOX', 6 UNION ALL
SELECT 'OFX', 7;
WITH YourData(ID, INH, RIF, KM, AK, CM, MOX, OFX) As
(SELECT Sample_ID, INH, RIF, KM, AK, CM, MOX, OFX
FROM dbo.[GCT_Rug] WHERE Sample_ID NOT LIKE '99%')
, Unpivoted AS
(
SELECT S_R_Flag,
Thing,
Site =
CASE
WHEN LEFT(ID,1) = 1 THEN 1
WHEN LEFT(ID,1) = 6 THEN 1
WHEN LEFT(ID,1) = 8 THEN 2
WHEN LEFT(ID,1) = 9 THEN 3 END
FROM YourData
UNPIVOT
(S_R_Flag FOR Thing IN (INH, RIF, KM, AK, CM, MOX, OFX)
)AS unpvt)
SELECT Thing
,SRFLAG =
CASE
WHEN S_R_Flag = 1 THEN 'S'
WHEN S_R_Flag = 2 THEN 'R'
END
,[1] AS IND
,round(CAST([1] AS FLOAT) / NULLIF(SUM([1]) OVER (PARTITION BY Thing),0)*100,1) AS 'Ind Percent'
,[2] AS MD
,round(CAST([2] AS FLOAT) / NULLIF(SUM([2]) OVER (PARTITION BY Thing),0)*100,1) AS 'MD Percent'
,[3] AS 'SA'
,round(CAST([3] AS FLOAT) / NULLIF(SUM([3]) OVER (PARTITION BY Thing),0)*100,1) AS 'SA Percent'
FROM Unpivoted
INNER JOIN @myOrder
ON Unpivoted.Thing= @myOrder.rug
PIVOT (COUNT (Site) FOR Site IN ( [1], [2], [3])) AS pvt
ORDER BY rugOrder,
SRFLAG;
Was bedeutet die Fehlermeldung "Must declare the scalar variable @myOrder" und warum kann ich nicht mit ihr verknüpfen?
Nochmals vielen Dank, ihr Jungs (besonders Martin) seid großartig!