2017-08-28 140 views
5

Başlık için özür dilerim ama bunu açıklamam için bile seviyemin üstünde bir şeyler yapmaya çalışıyorum. Gıda yeni değişkenler için temeldir nerede bir listesini yapmak için başarmış sorguda kendisiyle tabloyu katılarakSQL Server - tablomu normalleştirmeye çalışıyorum

Person food  Amount 
Mike Butter 3 
Mike Milk  4 
Mike Chicken 2 
Tim  Milk  4 
John Chicken 2 

:

Ben değişkenler kişi, gıda ve miktarı ile bir tablo var ki ve değer miktardır. Yukarıdaki tablo haline gelmeli

Person Butter Milk Chicken 
Mike 3  4 2 

kod yaklaşık olarak: o kapalı tüm kutuları denetler çünkü

Select 
    a.person, 
    b.amount as Butter, 
    c.amount as Milk, 
    d.amount as Chicken 
from PersonFoodAmount a 
inner join PersonFoodAmount b on a.person = b.person 
inner join PersonFoodAmount c on a.person=c.person 
where b.food='Butter' 
and c.food='Milk' 
and d.food='Chicken' 

Şimdi, bu bana Mike veriyor. Ama aynı zamanda kısmi eşleşmeleri olması gerekir:

Person Butter Milk Chicken 
Mike 3  4 2 
Tim  NULL 4 NULL 
John NULL Null 2 

Tam dış dahil katılır her türlü denedim katılmak ama hala sadece tam buzdolabı kişileri olsun.

Herhangi bir öneriniz var mı?

+3

... –

cevap

6

Bunu yapmak için Pivot'u kullanabilirsiniz.

DECLARE @PersonStuff TABLE (Person varchar(10), Food varchar(10), Amount INT) 

INSERT INTO @PersonStuff VALUES 
('Mike','Butter', 3), 
('Mike','Milk', 4), 
('Mike','Chicken', 2), 
('Tim','Milk', 4), 
('John','Chicken', 2) 

SELECT 
    * 
FROM ( 
    SELECT 
     * 
    FROM @PersonStuff) AS SourceTable 
PIVOT ( 
    AVG(Amount) 
    FOR Food IN ([Butter],[Milk],[Chicken]) 
) AS PivotTable 

Sonuç:

Eğer sql pivotu kullanmak gerekir
Person Butter Milk Chicken 
John NULL NULL 2 
Mike 3  4  2 
Tim  NULL 4  NULL 
+0

Bu gitmenin yolu gibi görünüyor, teşekkürler. Fakat daha da karmaşık hale getirmek için, "süt" aslında "süt" kategorisine giren birkaç sayıdır. "" Için "(" (184 ',' 202 ',' 235 ',' 253 ',' 325 ',' 359 ',' 377 ')' de "için" araştırmaya çalışıyorum. " Gıda IN ([Tereyağı]) ama ben bir "olsun:" Yanlış değer "('184', '202', '235', '253', '325', '359', '377') tilfreds olarak PIVOT operatöründe sağlanmıştır. " – user2523167

+0

Böyle değerleri yazmalısınız ([184], [202], [235], [253], [325], [359], [377]) –

+0

Ama yapabilir miyim? Birden fazla sayıyı düzeltmek için ** AS ** bir değişken, tilfreds (/ süt)? Yazdığınız gibi görünüyor Her sayı için ayrı bir değişken alır mıyım? ("yedi farklı gıda maddesi")? – user2523167

5

ben daha iyi bir şey, koşullu toplanmasına öneririm:

SELECT t.person, 
     MAX(CASE WHEN t.food = 'Butter' THEN t.amout END) as Butter, 
     MAX(CASE WHEN t.food = 'Milk' THEN t.amout END) as Milk, 
     MAX(CASE WHEN t.food = 'Chicken' THEN t.amout END) as Chicken 
FROM PersonFoodAmount t 
GROUP BY t.person 

Bu şekilde, kendisine masayı 3 kez katılmak zorunda değilsiniz. Ayrıca, bu yazıyı anlamak için bir kez daha okumayı çok daha kolay buluyorum.

+0

gören veri türü NULL maksimum operatör için geçersiz. –

+4

Max, null sütunlarda düzgün çalışıyor. – sagi

+0

@sagi neden veya ne zaman bir çözümünüzü PIVOT üzerinden kullanır? – Eli