2017-03-24 8 views
0

私はUNIONを使用して複数の行を結合しようとしていますが、追加のデータも引き出す​​必要があります。私の考えは、外側のクエリでUNIONを使用することでしたが、私はそれを動作させるように見えることができません。それとも私はこれについて間違っているのだろうか?外部クエリでユニオン

私が持っているデータは、このようなものです:私はこれまで来ている最も近いが、以下のようなUNION文を使用している

+------+---------+------+-------+ 
| ID | DayType | Time | Tasks | 
+------+---------+------+-------+ 
| 1001 | Weekday | AM |  9 | 
| 1001 | Weekend | AM |  7 | 
| 1001 | Weekday | PM |  8 | 
| 1001 | Weekend | PM |  2 | 
| 1002 | Weekday | PM |  5 | 
| 1002 | Weekend | PM |  3 | 
+------+---------+------+-------+ 

+------+------+-------+---------+---------+ 
| ID | Time | Total | Weekday | Weekend | 
+------+------+-------+---------+---------+ 
| 1001 | AM |  5 |  5 |  0 | 
| 1001 | AM |  2 |  0 |  2 | 
| 1001 | AM |  4 |  1 |  3 | 
| 1001 | AM |  5 |  3 |  2 | 
| 1001 | PM |  5 |  3 |  2 | 
| 1001 | PM |  5 |  5 |  0 | 
| 1002 | PM |  4 |  2 |  2 | 
| 1002 | PM |  3 |  3 |  0 | 
| 1002 | PM |  1 |  0 |  1 | 
+------+------+-------+---------+---------+ 

私が見たいと思って何、このようなものです:次のようなものになり

SELECT * FROM 
(
    SELECT Weekday, 'Weekday' as 'DayType' FROM t1 
    UNION 
    SELECT Weekend, 'Weekend' as 'DayType' FROM t1 
) AS X 

+---------+---------+ 
| Weekday | DayType | 
+---------+---------+ 
|  2 | Weekend | 
|  0 | Weekday | 
|  2 | Weekday | 
|  0 | Weekend | 
|  10 | Weekday | 
+---------+---------+ 

「平日」列の数字が何であるかについての韻や理由はありませんが、何とかグループ化されていると思われます。もちろん、他にもいくつかの列がありませんが、内部クエリとして外部クエリに大きなスコープを入れることができないため、それらを引き出す方法を理解することはできません。

答えて

2

で試してみてください:

select Id, DayType = 'Weekend', [time], Tasks=sum(Weekend) 
from t 
group by id, [time] 
union all 
select Id, DayType = 'Weekday', [time], Tasks=sum(Weekday) 
from t 
group by id, [time] 
0

あなたはunion allsum()group by id, timeを使用して集計クエリ、Weekday用とWeekendのための1のペアをしたいように見えます。この

select ID, 'Weekday' as DayType, Time, sum(Weekday) 
from t1 
group by ID, Time 
union all 
select ID, 'Weekend', Time, sum(Weekend) 
from t1 
group by ID, Time 
order by order by 1, 3, 2 
0

はテストされていません、それはトリックを行う必要があります。計算に2つのプロセスステップが必要な場合があります.1つは合計、1つはステートメントの場合です。余分な行がある場合は、maxステートメントを使い、ID、Time、type_dayでグループ化してください。

Proc sql; create table want as select ID, Time, 
    sum(weekday) as weekdayTask, 
    sum(weekend) as weekendTask, 
    case when calculated weekdaytask>0 then weekdaytask 
     when calculated weekendtask>0 then weekendtask else . 
     end as Task, 
    case when calculated weekdaytask>0 then "Weekday" 
     when calculated weekendtask>0 then "Weekend" 
     end as Day_Type 
from have 
group by ID, Time 
;quit; 

Proc sql; create table want2 as select ID, Time, Day_Type, Task 
from want 
;quit; 
関連する問題