我有三个具有以下结构的表(商店,销售和产品):

--Stores
IdStore   StoreName
1A        Store A
2B        Store B
3C        Store C

-- Products
IdProduct   Desc
1G          Product 1
2A          Product 2
3A          Product 3
4A          Product 4

--Sales
TicketNo  Store     Product     Qty
1001      Store A   Product 1   10
1002      Store A   Product 1   10
1003      Store B   Product 3   50
1004      Store A   Product 2   20
1005      Store A   Product 3   5
1006      Store B   Product 1   30

目前,我有以下查询:

SELECT S.StoreName, sum(SA.Qty), P.Desc
FROM SALES SA
cross apply (select top 1 * from Stores S where SA.Store = S.StoreName) S
cross apply (select top 1 * from Products P where SA.Product = P.Desc) P
group by S.StoreName, P.Desc

根据上面的表结构和数据,查询结果如下:

-- output
StoreName    Qty   Desc
Store A      20    Product 1
Store A      20    Product 2
Store A      5     Product 3
Store B      30    Product 1
Store B      20    Product 2

我的问题是,是否存在一种获得相同结果但顺序不同的方法,以及是否有可能从一行中的一个商店中获取所有结果,如下所示:

Store    Product 1  Product 2  Product 3
Store A  20         20         5    
Store B  30         20         0

或类似的东西:

Store     Result (in same line)
Store A   20;20;5;
Store B   30;20;0;

#1楼 票数:2 已采纳

首先,您应该使用INNER JOIN而不是CROSS APPLY:

SELECT S.StoreName, P.Desc,sum(SA.Qty) as QTY
FROM SALES SA
    INNER JOIN Stores S ON SA.Store = S.StoreName
    INNER JOIN Products P ON SA.Product = P.Desc
group by S.StoreName, P.Desc

如果预先知道列数,则可以使用PIVOT运算符将行转换为列:

SELECT S.StoreName, [Product 1], [Product 2], [Product 3]
FROM 
( SELECT SA.StoreName, P.Desc,SA.Qty
  FROM SALES SA
    INNER JOIN Stores S ON SA.Store = S.StoreName
    INNER JOIN Products P ON SA.Product = P.Desc
) Q
PIVOT 
(
    SUM(Qty)
    FOR Q.Desc IN ([Product 1], [Product 2], [Product 3])
) AS pvt
ORDER BY StoreName

坦率地说,在客户端上生成适当的表可能会更容易。 PIVOT无法处理任意数量的列。 另一方面,在ASP.NET中,可以使用LINQ等按商店和产品对数据进行分组,然后根据该数据生成表行。 如果使用了像Entity Framework这样的ORM,则数据将已经处于适当的结构中。

生成所需表可以使用两个循环,例如:

<thead>
    <tr>
        <th>Store Name</th>
        <th>Product 1</th>
        ...
    </tr>
</thead>
@foreach(var store in Model.Stores)
{
    <tr>
        <td>@store.StoreName</td>
        @foreach(var product in store.Products.OrderBy(p=>p.Desc))
        {
           <td>@product.Qty</td>
        }
    </tr>
}

您可以使用LINQ获得所有产品名称,例如:

var productNames = Stores.SelectMany(store=>store.Products)
                         .Select(p=>p.Desc)
                         .Distinct()
                         .OrderBy(desc=>desc)
                         .ToArray();

并使用它们在循环中自己生成标头

#2楼 票数:1

干得好。 您将需要PIVOT功能,但是您需要定义产品的名称。

请参见下面的样机:

DECLARE @Stores TABLE(IdStore VARCHAR(100),[StoreName] VARCHAR(100));
INSERT INTO @Stores 
--Stores
select '1A','Store A' UNION ALL
select '2B','Store B' UNION ALL
select '3C','Store C'


DECLARE @Products TABLE(IdProduct VARCHAR(100),[Desc] VARCHAR(100));
INSERT INTO @Products 
-- Products
select '1G','Product 1' UNION ALL
select '2A','Product 2' UNION ALL
select '3A','Product 3' UNION ALL
select '4A',' Product 4'

DECLARE @Sales TABLE(TicketNo INT, Store  VARCHAR(100),[Product] VARCHAR(100), Qty INT);
INSERT INTO @Sales
--Sales
select '1001','Store A','Product 1','10' UNION ALL
select '1002','Store A','Product 1','10' UNION ALL
select '1003','Store B','Product 3','50' UNION ALL
select '1004','Store A','Product 2','20' UNION ALL
select '1005','Store A','Product 3','5' UNION ALL
select '1006','Store B','Product 1','30'




SELECT p.*
FROM 
(
    SELECT S.StoreName, SA.Qty, P.[Desc]
    FROM
        @SALES SA
    left join @Stores S on SA.Store = S.StoreName
    left join  @Products P on SA.Product = P.[Desc] 

)t
PIVOT
(
    SUM(Qty) FOR [Desc] IN ([Product 1],[Product 2],[Product 3] /*add as many as you need*/)
)p;

  ask by User1899289003 translate from so

未解决问题?本站智能推荐:

2回复

连接查询后的SQL透视

将另外两列添加到c(表1)。 主键是IMSI。 如果IMSI具有2个或更多APN,则将其填充到其他列(apn2,apn3)。 查询结果1: 预期产量: 我的查询:
4回复

SQL-将符号的列值转换为以符号作为名称和布尔类型的列

我有此表的“符号”列: 我需要将其转换为一个表格,该表格将Symbol的列值(不同)作为新的Column Name。 这些列的类型应为bool或INT(0/1)。 结果表应如下所示: PS如果一组列是由另一个查询动态生成的,该怎么办?
2回复

在TSQL中将行转置为列并使值向下流动

我正在使用TSQL。 如果我有以下结果: 我想转置成这样: 我该如何实现? 我有以下查询: 这给了我指定节点下面的所有项目,包括指定节点。
2回复

SQL Server数据透视查询替代或优化

所以我有这些表: 我想要一个将两个表中的数据组合在一起的查询,如下所示: 我知道我可以通过以下方式实现此目的: 到目前为止,这会返回结果(我认为),但我有大约一百万行,而且运行速度非常慢。 任何替代方法来实现这一目标会更快? 我正在使用SQL Server 2012。
2回复

复杂的SQL Pivot查询

快速背景知识使我的问题变得有意义:系统以问卷的形式从用户那里收集数据。 用户属于组织,组织属于部门,并且各个部门的问题/计算方式(在调查表中可以找到)不同。 (问题由用户回答;计算由系统计算)。 存在以下表格: 部门 ( 部门 ID,名称) 组织 (组织ID,名称,部门ID)
2回复

SQL查询以获取过去17周中按周分组的数据

在SQL Server 2012中,我们试图按过去17周的每周分组。 输入数据 SQL对此进行了尝试:我不确定它是否朝着正确的方向发展。 输出数据: 任何帮助,将不胜感激! 提前致谢 !
3回复

在SQL中使用多个列进行数据透视

我需要使用“通道”列对数据透视表进行如下显示,并根据“单位”对其进行分组。 实际表: 我需要的结果如下所示 我不是旋转和旋转概念的专家,我正在尝试以下查询来实现上述结果 如果执行此查询,我得到以下结果 使用多列在r-参考链接枢纽中实现相同的逻辑 这
1回复

将cateorical值转换为布尔列SQL

我希望'压扁'我的数据集以便于数据挖掘。 每个分类列应更改为多个布尔列。 我有一个具有分类值的列,例如: 我正在寻找一种方法来转动这个表,并有一个聚合函数告诉我这个ID是否有值A或B: 结果: 我尝试使用PIVOT,但不知道在其中使用哪个聚合函数。 也寻找SF的答