繁体   English   中英

SQL Server查询结果逐列显示

[英]SQL Server query result by column to row

这是我的示例代码:

SQL小提琴

我需要这样的结果:

category    outlet1     outlet2     outlet3
Sale        70          20          40
Expense     250         130         200

我怎样才能做到这一点?

编辑:我的商店不固定,对不起,您事先没有告诉您。

您可以使用条件聚合来解决您的特定问题

SELECT c.category,
       SUM(CASE WHEN o.outletname = 'Outlet1' THEN t.amt ELSE 0 END) as Outlet1,
       SUM(CASE WHEN o.outletname = 'Outlet2' THEN t.amt ELSE 0 END) as Outlet2,
       SUM(CASE WHEN o.outletname = 'Outlet3' THEN t.amt ELSE 0 END) as Outlet3
FROM tblcategory c INNER JOIN
     tbltran t
     ON t.catid = c.id INNER JOIN
     tbloutlet o
     ON o.id = t.outletid
GROUP BY c.category;

如果出口名称不固定,则需要动态SQL。 使用单个SELECT查询无法解决该问题。

这里有动态插座http://sqlfiddle.com/#!18/a7b09/25

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

select @cols = STUFF((SELECT ',' + QUOTENAME(outletname) 
                    from tbloutlet
                    group by outletname
                    order by outletname
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT category,' + @cols + ' from 
             (
                SELECT c.category, o.outletname, SUM(t.amt) as amt
                FROM tblcategory c
                INNER JOIN tbltran t ON t.catid = c.id
                INNER JOIN tbloutlet o ON o.id = t.outletid
                GROUP BY c.category, o.outletname
            ) x
            pivot 
            (
                sum(amt)
                for outletname in (' + @cols + ')
            ) p '

execute(@query);  

您也可以使用PIVOT运算符

SELECT *
FROM
(
    SELECT category, outletname, amt
    FROM   tblcategory c
    INNER JOIN tbltran t ON t.catid = c.id
    INNER JOIN tbloutlet o ON o.id = t.outletid
) d
PIVOT
(
     SUM(amt)
     FOR outletname in ([Outlet1] , [Outlet2] , [Outlet3])
) p

编辑:以下是动态SQL版本

declare @Outlets nvarchar(max),
    @SQL    nvarchar(max)

select  @Outlets = isnull(@Outlets + ',', '') + quotename(outlet)
from    outlet

select  @SQL = '
SELECT *
FROM
(
    SELECT category, outletname, amt
    FROM   tblcategory c
    INNER JOIN tbltran t ON t.catid = c.id
    INNER JOIN tbloutlet o ON o.id = t.outletid
) d
PIVOT
(
     SUM(amt)
     FOR outletname in (' + @Outlets + ')
) p'

print   @SQL  -- print out for verification
exec    sp_executesql @SQL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM