sql - 复杂的组SQL查询

标签 sql group-by pivot

这是我的查询和结果;

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-03-04、150、200)是每个商店的日期和收入 我想要得到那样的结果 我也在 sql 中尝试过“pivot”,但它对我不起作用

抱歉我的英语不好。 -谢谢

最佳答案

您可以使用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)

如果你的存储数量未知,那么你可以使用动态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)

关于sql - 复杂的组SQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15834870/

相关文章:

sql - 在 Firebird 中创建一个整数时间戳

mysql - 无法在 mysql 中创建表错误(150)

mysql - 使用 : join, 优化 MySQL 查询 where, group by, having

mysql - 如何使用 "select count(*)"和 "group by"加速 "where"?

python - 在python pandas中添加组列的百分比

MySQL 将字段名称转换为行中的值

sql - 有人在单元测试 SQL 存储过程方面取得过成功吗?

sql - IS NULL 条件结果是否反转?

MYSQL 对具有唯一结果的列求和

sql - 将行折叠成一列