2013-04-05 316 views
2

這裏是我的查詢和結果;複雜的組SQL查詢

select 
DATEADD(dd, DATEDIFF(dd, 0, PostDate), 0) as Date, 
Stores.Name StoreName, 
SUM(PosCash + PosCredit + PosBillCash + PosBillCredit) as Revenue 
from StoreRevenue 
inner join Stores on Stores.ID = StoreRevenue.StoreID 
group by DATEADD(dd, DATEDIFF(dd, 0, PostDate), 0), Stores.Name 

結果:http://prntscr.com/zaele

我想創建一個表(結果),必須是按日期和商店名稱組。

Date, Avcılar Mağaza, Ataşehir Mağaza 
2013-03-04, 150, 200 
2013-03-05, 200, 250 
2013-03-06, 300, 150 

行子組(這些的:2013年3月4日,150,200)的日期和收入我想那種結果 的每個門店 的我也曾嘗試「支點」在SQL中,但它不適用於我

對不起,我的英語。 -Thanks

回答

2

可以使用PIVOT函數從行變換的數據列:

select * 
from 
(
    select 
    DATEADD(dd, DATEDIFF(dd, 0, PostDate), 0) as Date, 
    Stores.Name StoreName, 
    (PosCash + PosCredit + PosBillCash + PosBillCredit) as Revenue 
    from StoreRevenue 
    inner join Stores 
    on Stores.ID = StoreRevenue.StoreID 
) d 
pivot 
(
    sum(Revenue) 
    for StoreName in ([Avcılar Mağaza], [Ataşehir Mağaza]..) 
) piv; 

或者你可以使用聚合函數與CASE

select DATEADD(dd, DATEDIFF(dd, 0, PostDate), 0) as Date, 
    sum(case when Stores.Name = 'Avcılar Mağaza' 
     then PosCash + PosCredit + PosBillCash + PosBillCredit end) as [Avcılar Mağaza], 
    sum(case when Stores.Name = 'Ataşehir Mağaza' 
     then PosCash + PosCredit + PosBillCash + PosBillCredit end) as [Ataşehir Mağaza] 
from StoreRevenue 
inner join Stores 
    on Stores.ID = StoreRevenue.StoreID 
group by DATEADD(dd, DATEDIFF(dd, 0, PostDate), 0) 

如果你有一個未知的數字fo店,那麼你可以SE動態SQL:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
        from Stores 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT Date, ' + @cols + ' 
      from 
      (
       select 
        DATEADD(dd, DATEDIFF(dd, 0, PostDate), 0) as Date, 
        Stores.Name StoreName, 
        (PosCash + PosCredit + PosBillCash + PosBillCredit) as Revenue 
       from StoreRevenue 
       inner join Stores 
        on Stores.ID = StoreRevenue.StoreID 
      ) x 
      pivot 
      (
       sum(Revenue) 
       for StoreName in (' + @cols + ') 
      ) p ' 

execute(@query) 
+0

它可以如何動態存儲名稱? – ertan2002 2013-04-05 13:23:49

+0

@ user2107255是的,如果商店名稱未知,則可以使用動態SQL。查看我的編輯 – Taryn 2013-04-05 13:23:50

+0

@ user2107255不客氣! – Taryn 2013-04-05 13:34:27

2

試試這個:

WITH CTE 
AS 
(
    select 
     DATEADD(dd, DATEDIFF(dd, 0, PostDate), 0) as Date, 
     Stores.Name StoreName, 
     PosCash + PosCredit + PosBillCash + PosBillCredit as Revenue 
    from StoreRevenue 
    inner join Stores on Stores.ID = StoreRevenue.StoreID 
) 
SELECT * 
FROM CTE AS c 
PIVOT 
(
    SUM(Revenue) 
    FOR StoreName IN ([Avcılar Mağaza], [Ataşehir Mağaza], ...) 
) AS p 
+0

僅供參考,你其實並不需要內'總和()',你可以只用添加列的內部查詢,然後'sum'在樞軸 – Taryn 2013-04-05 13:19:09

+0

@bluefeet - 你是對的。我只是注意到這一點。 – 2013-04-05 13:21:06

+0

謝謝! prntscr.com/zah7v這裏是我的結果,但我們可以動態存儲名稱嗎?只需添加存在的商店名稱作爲列這樣的一種? – alim 2013-04-05 13:21:29