2

selectを2回使用してから結合せずに、SQL Serverでこのようなクエリを作成する方法はありますか?

select trans_date, datepart(HOUR,trans_time) as hour,
(datepart(MINUTE,trans_time)/30)*30 as minute,
case 
when paper_number = 11111/*paperA*/
then sum(t1.price*t1.amount)/SUM(t1.amount)*100 
end as avgA,
case 
when paper_number = 22222/*PaperB*/
then sum(t1.price*t1.amount)/SUM(t1.amount)*100 
end as avgB
from dbo.transactions t1
where trans_date = '2006-01-01' and (paper_number = 11111 or paper_number = 22222)
group by trans_date, datepart(HOUR,trans_time), datepart(MINUTE,trans_time)/30 
order by hour, minute

SQL Server から paper_number を group by に追加するように求められ、そうすると null が返されます

trans_date  hour    minute  avgA                avgB
2006-01-01  9       30      1802.57199725463    NULL
2006-01-01  9       30      NULL                169125.886524823
2006-01-01  10      0       1804.04742534103    NULL
2006-01-01  10      0       NULL                169077.777777778
2006-01-01  10      30      1806.18773535637    NULL
2006-01-01  10      30      NULL                170274.550381867
2006-01-01  11      0       1804.43466045433    NULL
2006-01-01  11      0       NULL                170743.4
2006-01-01  11      30      1807.04532012137    NULL
2006-01-01  11      30      NULL                171307.00280112
4

3 に答える 3

3

CASE 式全体で SUM() 関数を使用する

select trans_date, datepart(HOUR,trans_time) as hour, (datepart(MINUTE,trans_time)/30)*30 as minute,
       sum(case when paper_number = 11111/*paperA*/ then t1.price*t1.amount end) * 1.00
       / sum(case when paper_number = 11111/*paperA*/ then t1.amount end) * 100 as avgA,
       sum(case when paper_number = 22222/*PaperB*/ then t1.price*t1.amount end) * 1.00
       / sum(case when paper_number = 22222/*paperB*/ then t1.amount end) * 100 as avgB
from dbo.transactions t1
where trans_date = '2006-01-01'
group by trans_date, datepart(HOUR,trans_time), datepart(MINUTE,trans_time)/30 
order by hour, minute

SQLFiddle のデモ

于 2013-04-08T08:53:25.443 に答える