2015-08-03 99 views
1

我需要一些幫助,弄清楚如何最好地將數組轉換爲行向量。我的陣列看起來像這樣:將多行轉換爲列w。單排

+-----+-------+----------+ 
| ID | Grade | Quantity | 
+-----+-------+----------+ 
| Ape | Water | Y  | 
| Ape | Juice | Y  | 
| Ape | Milk | Y  | 
+-----+-------+----------+ 

每個ID最多可有4行僅由級區分(水,果汁,啤酒,牛奶);可能值的列表是靜態的。

我所需的輸出是這樣的:

+-----+----------+-------+-------+------+------+ 
| ID | Quantity | Water | Juice | Beer | Milk | 
+-----+----------+-------+-------+------+------+ 
| Ape | Y  |  1 |  1 | 0 | 1 | 
+-----+----------+-------+-------+------+------+ 

我自己的努力,儘可能把我作爲支點運營商,其將等級值成列,但它通過ID不組行,轉型後留下相同數量的行。

SELECT ID, Quantity, Water, Juice, Beer, Milk 
FROM 
    (SELECT ID, Grade, Quantity FROM Feeding WHERE ID = 'Ape') src 
    PIVOT(
    COUNT(Quantity) FOR [Grade] IN (ID, Quantity, Water, Juice, Beer, Milk) 
    )AS TransformData 

輸出:

+-----+----------+-------+-------+------+------+ 
| ID | Quantity | Water | Juice | Beer | Milk | 
+-----+----------+-------+-------+------+------+ 
| Ape | Y  |  1 |  0 | 0 | 0 | 
| Ape | Y  |  0 |  1 | 0 | 0 | 
| Ape | Y  |  0 |  0 | 0 | 1 | 
+-----+----------+-------+-------+------+------+ 

有什麼建議?

回答

1

如何;

;WITH Feeding(id,grade,quantity) as (
    select 'Ape','Water','Y' union all 
    select 'Ape','Juice','Y' union all 
    select 'Ape','Juice','Y' union all 
    select 'Ape','Juice','Y' union all 
    select 'Ape','Juice','Y' union all 
    select 'Ape','Milk', 'N' 
) 

SELECT * FROM 
    (SELECT ID, Grade, Quantity agg, Quantity FROM Feeding WHERE ID = 'Ape') src 
    PIVOT (COUNT(agg) FOR [Grade] IN (Water, Juice, Beer, Milk)) AS TransformData 

-

ID Quantity Water Juice Beer Milk 
Ape N   0  0  0  1 
Ape Y   1  4  0  0 
0

你可以試試下面的查詢: -

SELECT ID, Quantity, CASE WHEN Grade = 'WATER' THEN 1 ELSE 0 END AS WATER, 
        CASE WHEN Grade = 'JUICE' THEN 1 ELSE 0 END AS JUICE, 
        CASE WHEN Grade = 'BEER' THEN 1 ELSE 0 END AS BEER, 
        CASE WHEN Grade = 'MILK' THEN 1 ELSE 0 END AS MILK 
FROM YOUR_TABLE; 
0
select id, quantity, 
case when grade = 'Water' then 1 else 0 end as Water, 
when grade = 'Juice' then 1 else 0 end as Juice, 
when grade = 'Milk' then 1 else 0 end as Milk, 
when grade = 'Beer' then 1 else 0 end as Beer 
from feeding 

由於值列表是靜態的,這是一個辦法做到這一點。

0

試試這個

SELECT id 
    ,quantity 
    ,CASE 
     WHEN grade = 'Water' 
      THEN 1 
     ELSE 0 
     END AS Water 
    ,when grade = 'Juice' then 1 ELSE 0 END AS Juice 
    ,when grade = 'Milk' then 1 ELSE 0 END AS Milk 
    ,when grade = 'Beer' then 1 ELSE 0 END AS Beer 
FROM feeding 
0

試試這個讓單行結果

SELECT Id,Quantity, 
     SUM(CASE WHEN Grade='Water' THEN 1 ELSE 0 END) AS Water, 
     SUM(CASE WHEN Grade='Juice ' THEN 1 ELSE 0 END) AS Juice , 
     SUM(CASE WHEN Grade='Beer' THEN 1 ELSE 0 END) AS Beer, 
     SUM(CASE WHEN Grade='Milk' THEN 1 ELSE 0 END) AS Milk 
FROM Feed F 
GROUP BY Id,Quantity 

SQL Fiddle Demo