2011-09-05 99 views
1

我有一個表SQL GROUP BY和金額

AvailbilityDate | Resort | AccomName | Price | Min Occupancy 
24 June 2012 | Resort1 | Accom1 |  999 | 8 
24 June 2012 | Resort1 | Accom2 |  888 | 6 
24 June 2012 | Resort2 | Accom1a |  243 | 10 
24 June 2012 | Resort2 | Accom2a |  563 | 7 

我現在擁有的是

SELECT AvailbilityDate, Resort, MIN(Price) AS Lowest 
FROM mytable 
GROUP BY AvailbilityDate, Resort 

我希望能夠得到AccomNameMin Occupancy

很多感謝推進

+0

您正在使用的SQL Server的味道?是否它是ProgresSQL,mySQL,Microsoft SQL(如果是這樣的版本?) –

+0

MS SQL我可能需要也使它更清晰,通過工作組,但我想能夠得到Chalet名稱和Min Occ,但我不想要將它包含在組條件中 – richard

+0

2005 MS SQL對不起 – richard

回答

1

使用標準ANSI SQL,解決辦法是這樣的:

SELECT * 
FROM (
    SELECT AvailbilityDate, 
      resort, 
      accomName, 
      price, 
      min_occupancy, 
      min(price) over (partition by AvailbilityDate, Resort) as min_price 
    FROM deals_panel_view 
) t 
WHERE min_price = price; 

上的PostgreSQL,甲骨文,DB2,SQL服務器,Sybase和Terradata

+0

我會試試這個感謝馬我猜測t是表 – richard

+0

@richard。沒有't'是內部選擇的別名。對不起,我忘了FROM部分有;過(通過real_dep_date分區,resort_name)) –

+0

SELECT * FROM( SELECT real_dep_date, resort_name, real_price, std_occ, 分鐘(real_price)作爲MIN_PRICE )deals_panel_view WHERE MIN_PRICE = real_price ; – richard

0
SELECT AvailbilityDate, Resort, AccomName, "Min Occupancy", MIN(Price) AS Lowest 
FROM mytable 
GROUP BY AvailbilityDate, Resort 
+1

將無法​​工作,因爲您需要包含「分鐘佔用「和」GROUP BY「中的accomName –

+0

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中高亮顯示這些行,然後單擊」代碼樣本「按鈕(」{}「)編輯器工具欄可以很好地格式化和語法突出顯示它! –

+0

MS SQL會抱怨「最低入住率」和AccomName不在第 –

-1

SELECT AccomName,MIN([最小佔用])AS最低FROM MYTABLE GROUP BY AccomName

應工作這隻會給你所需的信息。如果您希望在已添加的所有字段中添加所需的字段,將會如下所示:

SELECT AvailbilityDate,AccomName,Resort,MIN(Price)AS Lowest,Min([Min Occupancy])as LowestMinOcc FROM mytable GROUP BY AvailbilityDate,AccomName,度假村

+0

這將給每個度假村提供多條線,因爲客房名稱不同 –

1

使用公共表表達式和排名功能,你可以這樣做

WITH cte as (
SELECT 
    ROW_NUMBER() over (PARTITION BY AvailabilityDate,Resort ORDER BY price) as row, 
    AvailbilityDate, 
    Resort, 
    AccomName, 
    Price, 
    [Min Occupancy] 
FROM mytable 
) 
SELECT AvailbilityDate,Resort,Price,AccomName,[Min Occupancy] from cte where row=1 
0

您可以通過幾種方式做到這一點。

1)排名 - 每a_horse_with_no_name的溶液

2)組由與跨應用。基本上將要分組的列插入第一個子查詢中,然後將所有其他列放入第二個子查詢中。在第二個子查詢中使用Order By來處理您想要應用MIN(或MAX)的任何列。

SELECT a.AvailbilityDate, 
     a.resort, 
     b.AccomName, 
     b.min_occupancy, 
     b.Lowest 
FROM 
(
SELECT t1.AvailbilityDate, t1.resort 
    FROM myTable t1 
    GROUP BY t1.AvailbilityDate, t1.resort 
) a 
CROSS APPLY 
( 
    SELECT TOP 1 t2.AccomName, t2.min_occupancy, t2.price as Lowest 
     FROM mytable t2 
     WHERE t2.AvailbilityDate = a.AvailbilityDate 
      AND t2.resort = a.resort 
      ORDER BY t2.price ASC 
) b 

3)使用SELECT語句中與GROUP BY子查詢(不是很優雅,但工程)。這是假設對於AvailbilityDate和resort的每個組合,只有一個具有給定最低價格的accomName。

SELECT a.AvailbilityDate, 
     a.resort, 
     (SELECT accomName FROM myTable t1 
     WHERE t1.AvailbilityDate = a.AvailbilityDate 
      AND t1.resort = a.resort 
      AND t1.price = MIN(a.price) 
     ) as accomName, 
     (SELECT min_occupancy FROM myTable t1 
     WHERE t1.AvailbilityDate = a.AvailbilityDate 
      AND t1.resort = a.resort 
      AND t1.price = MIN(a.price) 
     ) as min_occupancy, 
     MIN(a.price) as Lowest 
    FROM myTable a 
    GROUP BY a.AvailbilityDate, a.resort