SQL pivot 按 orderNr 获取产品

Posted

技术标签:

【中文标题】SQL pivot 按 orderNr 获取产品【英文标题】:SQL pivot get products by orderNr 【发布时间】:2013-07-22 08:34:16 【问题描述】:

我有 2 张桌子:

'OrderHeader' 包含 OrderNr 和 OrderContact 列。 'OrderDetail 与列 OrderNr 和 OrderSerial。

对于每个 ordernr,最多有 3 个 ordererials。 所以,我想要得到的是一个带有列的表格:

订单号 订单联系人 OrderSerial1 OrderSerial2 OrderSerial3

我现在被我的支点困住了

    SELECT  OrderNr,
        OderContact,
        [1] as OrderSerial1,
        [2] as OrderSerial2,
        [3] as OrderSerial3
FROM
    (select H.OrderNR as OrderNr,
            OrderContact as OderContact,
            OrderSerialsNr
    from OrderHeader H inner join OrderDetail D on H.OrderNr = D.OrderNr
    ) AS PivSource
PIVOT
(count(OrderSerialsNr) for OrderSerialsNr in([1],[2],[3])) as pvt

我为此使用了 Adventureworks 数据库。

   USE [AdventureWorks2008R2]
GO

create view [test].[OrderHeader] (OrderNr,OrderContact)
as
SELECT  SalesOrderID,
        FirstName + ' ' + LastName

FROM         Sales.SalesOrderHeader INNER JOIN
                      Sales.Customer ON Sales.SalesOrderHeader.CustomerID = Sales.Customer.CustomerID INNER JOIN
                      Person.Person ON Sales.Customer.PersonID = Person.Person.BusinessEntityID
GO

CREATE view [test].[OrderDetail] (OrderNr,OrderSerialsNr,Price)
as
SELECT [SalesOrderID]
      ,[ProductID]
      ,[unitPrice]
  FROM [AdventureWorks2008R2].[Sales].[SalesOrderDetail]
  where SalesOrderID in (select SalesOrderID
                        from [AdventureWorks2008R2].[Sales].[SalesOrderDetail]
                        group by SalesOrderID
                        having COUNT(SalesOrderID) < 4)
GO

请帮忙,因为我不知道该去哪里找了:)。

【问题讨论】:

请发布两个表中的一些示例数据和所需的输出。 【参考方案1】:

要在数据透视表中获取数据,in 子句应该从表中获取正确的数据

你可以从这个查询中得到更多的想法

如果 1 和 2 不在您的表中,它将不会显示为计数和列值

CREATE TABLE #OrderHeader
(ORDERNR INT,
ORDERCONTACT CHAR(5))

CREATE TABLE #ORDERDETAIL
(ORDERNR INT,
ORDERSERIAL VARCHAR(10)
)

INSERT INTO #OrderHeader VALUES ( 1, 'X')
INSERT INTO #ORDERDETAIL VALUES ( 1, 'X1')
INSERT INTO #ORDERDETAIL VALUES ( 1, 'X2')
INSERT INTO #ORDERDETAIL VALUES ( 1, 1)
INSERT INTO #ORDERDETAIL VALUES ( 1, 2)


SELECT * FROM #OrderHeader
SELECT * FROM #ORDERDETAIL

SELECT  OrderNr,
        OderContact,
        [1] as OrderSerial1,
        [2] as OrderSerial2,
        [3] as OrderSerial3
FROM
    (select H.OrderNR as OrderNr,
            OrderContact as OderContact,
            ORDERSERIAL
    from #OrderHeader H inner join #ORDERDETAIL D on H.OrderNr = D.OrderNr
    ) AS PivSource
PIVOT
(count(ORDERSERIAL) for ORDERSERIAL in([1],[2],[3])) as pvt


DROP TABLE #OrderHeader
DROP TABLE #ORDERDETAIL

【讨论】:

好的,所以枢轴是不可能的,除非你知道这些值。感谢您的建议!我会寻找另一种方法来做到这一点。

以上是关于SQL pivot 按 orderNr 获取产品的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle SQL 中按报告日期的 PIVOT 值

Sql 动态行转列 pivot

sql 获取WooCommerce按产品/邮政ID或产品SKU获取订单ID

SQL Pivot Table w/ and w/o Distinct Same Result

SQL获取总数并同时使用pivot

sql server如何通过pivot对数据进行行列转换(进阶)