向大神求一个横向展示数据的语法

陈北徐公 2018-05-10 02:39:42
大概需求如下图所示,横向展示数据,语法不要写死收货方,方便后续添加收货方。

...全文
824 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈北徐公 2018-05-10
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
写了个例子
--测试数据
if not object_id(N'Tempdb..#入库表') is null
	drop table #入库表
Go
Create table #入库表([日期] Date,[工单号] nvarchar(26),[收货方] nvarchar(22),[体积] int)
Insert #入库表
select '2017/3/1',N'A30001',N'AA',25 union all
select '2017/3/1',N'A30002',N'BB',35 union all
select '2017/3/1',N'A30003',N'BB',35 union all
select '2017/3/2',N'A30003',N'BB',35
GO
if not object_id(N'Tempdb..#出库表') is null
	drop table #出库表
Go
Create table #出库表([日期] Date,[工单号] nvarchar(26),[收货方] nvarchar(22),[体积] int)
Insert #出库表
select '2017/3/1',N'B30001',N'AA',15 union all
select '2017/3/1',N'B30002',N'BB',25 union all
select '2017/3/1',N'B30003',N'BB',5
Go
--测试数据结束

DECLARE @sql VARCHAR(MAX);
SET @sql = 'select 日期';
SELECT @sql
    = @sql + ',sum(case 收货方 when ''' + 收货方 + ''' then 入库体积 else 0 end)[' + 收货方 + '入库体积]' + ',sum(case 收货方 when '''
      + 收货方 + ''' then 出库体积 else 0 end)[' + 收货方 + '出库体积]'
FROM
(
    SELECT DISTINCT
        收货方
    FROM
    (
        SELECT t1.*,
               t2.出库体积
        FROM
        (SELECT 日期, 收货方, SUM(体积) AS 入库体积 FROM #入库表 GROUP BY 日期, 收货方) t1
           LEFT JOIN
            (SELECT 日期, 收货方, SUM(体积) AS 出库体积 FROM #出库表 GROUP BY 日期, 收货方) t2
                ON t2.日期 = t1.日期
                   AND t2.收货方 = t1.收货方
    ) tab1
) a;
SET @sql
    = @sql
      + ' from (SELECT t1.*,
       t2.出库体积
FROM
(SELECT 日期, 收货方, SUM(体积) AS 入库体积 FROM #入库表 GROUP BY 日期, 收货方) t1
   LEFT JOIN
    (SELECT 日期, 收货方, SUM(体积) AS 出库体积 FROM #出库表 GROUP BY 日期, 收货方) t2
        ON t2.日期 = t1.日期
           AND t2.收货方 = t1.收货方)tab1  group by 日期';
EXEC (@sql);
感激不尽,我研究下,谢谢大神
二月十六 版主 2018-05-10
  • 打赏
  • 举报
回复
写了个例子
--测试数据
if not object_id(N'Tempdb..#入库表') is null
drop table #入库表
Go
Create table #入库表([日期] Date,[工单号] nvarchar(26),[收货方] nvarchar(22),[体积] int)
Insert #入库表
select '2017/3/1',N'A30001',N'AA',25 union all
select '2017/3/1',N'A30002',N'BB',35 union all
select '2017/3/1',N'A30003',N'BB',35 union all
select '2017/3/2',N'A30003',N'BB',35
GO
if not object_id(N'Tempdb..#出库表') is null
drop table #出库表
Go
Create table #出库表([日期] Date,[工单号] nvarchar(26),[收货方] nvarchar(22),[体积] int)
Insert #出库表
select '2017/3/1',N'B30001',N'AA',15 union all
select '2017/3/1',N'B30002',N'BB',25 union all
select '2017/3/1',N'B30003',N'BB',5
Go
--测试数据结束

DECLARE @sql VARCHAR(MAX);
SET @sql = 'select 日期';
SELECT @sql
= @sql + ',sum(case 收货方 when ''' + 收货方 + ''' then 入库体积 else 0 end)[' + 收货方 + '入库体积]' + ',sum(case 收货方 when '''
+ 收货方 + ''' then 出库体积 else 0 end)[' + 收货方 + '出库体积]'
FROM
(
SELECT DISTINCT
收货方
FROM
(
SELECT t1.*,
t2.出库体积
FROM
(SELECT 日期, 收货方, SUM(体积) AS 入库体积 FROM #入库表 GROUP BY 日期, 收货方) t1
LEFT JOIN
(SELECT 日期, 收货方, SUM(体积) AS 出库体积 FROM #出库表 GROUP BY 日期, 收货方) t2
ON t2.日期 = t1.日期
AND t2.收货方 = t1.收货方
) tab1
) a;
SET @sql
= @sql
+ ' from (SELECT t1.*,
t2.出库体积
FROM
(SELECT 日期, 收货方, SUM(体积) AS 入库体积 FROM #入库表 GROUP BY 日期, 收货方) t1
LEFT JOIN
(SELECT 日期, 收货方, SUM(体积) AS 出库体积 FROM #出库表 GROUP BY 日期, 收货方) t2
ON t2.日期 = t1.日期
AND t2.收货方 = t1.收货方)tab1 group by 日期';
EXEC (@sql);


34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧