[]
sql ile bir gruplama sorusu
Selamlar,
Şimdi şehirlere göre, hangi gün, ne kadar toplam satış yapılmış şu sorgu ile getiriyoruz.
SELECT CITY, DAYOFWEEK_, SUM(LINETOTAL) AS TOTAL
FROM SALEORDERS
GROUP BY CITY, DAYOFWEEK_
ORDER BY 1
CITY DAYOFWEEK_ TOTAL
ADANA Cuma 173147.1293
ADANA Pazartesi 207692.6600
ADANA Çarşamba 213926.5284
ADANA Salı 191857.1025
ADANA Pazar 197343.1184
ADANA Perşembe 224699.9108
ADANA Cumartesi 199707.0810
ADIYAMANPazartesi 36477.0950
ADIYAMANCumartesi 37508.1629
ADIYAMANPazar 45354.8697
gibi bir çıktısı oluyor. Buradan "en yüksek" satış gerçekleşen satır bilgilerini çekmek istiyorum il bazında.
ADANA Perşembe 224699.9108
ADIYAMANPazar 45354.8697
gibi.
Bir üst selecte çıkarak yapıyorum ama yanına gününü de yazdıramıyorum.
Nasıl yaparım :)
Şimdi şehirlere göre, hangi gün, ne kadar toplam satış yapılmış şu sorgu ile getiriyoruz.
SELECT CITY, DAYOFWEEK_, SUM(LINETOTAL) AS TOTAL
FROM SALEORDERS
GROUP BY CITY, DAYOFWEEK_
ORDER BY 1
CITY DAYOFWEEK_ TOTAL
ADANA Cuma 173147.1293
ADANA Pazartesi 207692.6600
ADANA Çarşamba 213926.5284
ADANA Salı 191857.1025
ADANA Pazar 197343.1184
ADANA Perşembe 224699.9108
ADANA Cumartesi 199707.0810
ADIYAMANPazartesi 36477.0950
ADIYAMANCumartesi 37508.1629
ADIYAMANPazar 45354.8697
gibi bir çıktısı oluyor. Buradan "en yüksek" satış gerçekleşen satır bilgilerini çekmek istiyorum il bazında.
ADANA Perşembe 224699.9108
ADIYAMANPazar 45354.8697
gibi.
Bir üst selecte çıkarak yapıyorum ama yanına gününü de yazdıramıyorum.
Nasıl yaparım :)
Hiçbir şekilde aşağıdaki kodu garanti etmiyorum, Chat GPT verdi :)
SELECT s1.CITY, s1.DAYOFWEEK_, s1.TOTAL
FROM (
SELECT CITY, DAYOFWEEK_, SUM(LINETOTAL) AS TOTAL
FROM SALEORDERS
GROUP BY CITY, DAYOFWEEK_
) AS s1
JOIN (
SELECT CITY, MAX(TOTAL) AS MAX_TOTAL
FROM (
SELECT CITY, DAYOFWEEK_, SUM(LINETOTAL) AS TOTAL
FROM SALEORDERS
GROUP BY CITY, DAYOFWEEK_
) AS s2
GROUP BY CITY
) AS s3
ON s1.CITY = s3.CITY AND s1.TOTAL = s3.MAX_TOTAL
SELECT s1.CITY, s1.DAYOFWEEK_, s1.TOTAL
FROM (
SELECT CITY, DAYOFWEEK_, SUM(LINETOTAL) AS TOTAL
FROM SALEORDERS
GROUP BY CITY, DAYOFWEEK_
) AS s1
JOIN (
SELECT CITY, MAX(TOTAL) AS MAX_TOTAL
FROM (
SELECT CITY, DAYOFWEEK_, SUM(LINETOTAL) AS TOTAL
FROM SALEORDERS
GROUP BY CITY, DAYOFWEEK_
) AS s2
GROUP BY CITY
) AS s3
ON s1.CITY = s3.CITY AND s1.TOTAL = s3.MAX_TOTAL
- quaker (15.06.23 13:47:16)
Senin bu grupladığın tablonun yanında ekstra olarak, day_sales_in_city diye bir sütun olsaydı çok iyi olurdu, değil mi?
Böylece grupladığın tabloda, her bir şehir için 1,2,3,4,... yazacaktı. Ve sen sadece 1 olanları istiyorsun.
with table1 as (
SELECT CITY, DAYOFWEEK_, SUM(LINETOTAL) AS TOTAL
FROM SALEORDERS
GROUP BY CITY, DAYOFWEEK_
),
table2 as (
select *, row_number() over (partition by CITY order by TOTAL desc) as day_sales_in_city
from your_grouped_table
)
select *
from table2
where day_sales_in_city = 1
order by 1
Böylece grupladığın tabloda, her bir şehir için 1,2,3,4,... yazacaktı. Ve sen sadece 1 olanları istiyorsun.
with table1 as (
SELECT CITY, DAYOFWEEK_, SUM(LINETOTAL) AS TOTAL
FROM SALEORDERS
GROUP BY CITY, DAYOFWEEK_
),
table2 as (
select *, row_number() over (partition by CITY order by TOTAL desc) as day_sales_in_city
from your_grouped_table
)
select *
from table2
where day_sales_in_city = 1
order by 1
- kanepeee (15.06.23 21:26:33)
1