sql - 数据透视问题,SQL Server

标签 sql sql-server

查询:

SELECT   
SUM(TotalDue), DATENAME(dw, OrderDate), COUNT(DISTINCT ProductID)  
FROM Sales.SalesOrderHeader headers  
INNER JOIN Sales.SalesOrderDetail details  
ON  headers.SalesOrderID = details.SalesOrderID  
GROUP BY DATENAME(dw, OrderDate);

我目前的结果是:

560644420,8959  Wednesday   262
432484099,6362  Thursday    260
478917953,3263  Saturday    251
212585108,7496  Friday  238
457072471,4514  Monday  241
381773345,5659  Sunday  259
403492724,4161  Tuesday 235

现在我想对数据进行透视,这样我就可以将天数作为列。 问题是我不知道如何实现该结果 - 如何让第一行告诉它代表总和,第二行告诉它计算不同的 ID。

在此先感谢您的任何建议和帮助

我到目前为止的尝试,也许该查询会使您的回答更容易,因为您不必编写所有健壮的代码:

SELECT [Total], [Monday], [Tuesday]
FROM 
    (
        SELECT SUM(TotalDue)[Total], DATENAME(dw, OrderDate) [Day], COUNT(DISTINCT ProductID)[different products]
        FROM Sales.SalesOrderHeader headers
        INNER JOIN Sales.SalesOrderDetail details ON  headers.SalesOrderID = details.SalesOrderID
        GROUP BY DATENAME(dw, OrderDate)
) as source
PIVOT(
    COUNT([different products]) FOR [Day] IN ([Monday], [Tuesday])
) as pivoted;

我的预期结果(日期顺序不重要):

                        Monday            Tuesday         Wednesday ...
Sums of orders          457072471,4514    403492724,4161  560644420,8959
Different items count   241               235             262

最佳答案

你可以只联合两个数据透视表来做到这一点..

Select  Totals,Monday  ,Tuesday from (
SELECT  'TotalSum' As Totals, [Monday] as Monday, [Tuesday]
FROM 
    (
        SELECT sum(Totaldue) As TotalDue, DATENAME(dw, OrderDate) [Day] 
        FROM Sales.SalesOrderHeader headers
        INNER JOIN Sales.SalesOrderDetail details ON  headers.SalesOrderID = details.SalesOrderID
        group by  DATENAME(dw, OrderDate) 


) as source
PIVOT(
    sum(TotalDue) FOR [Day] IN ([Monday], [Tuesday])
    ) as pivoted

    union all

SELECT  'TotalCount' As Totals, [Monday] as Monday, [Tuesday]
FROM 
    (
        SELECT  DATENAME(dw, OrderDate) [Day], count(distinct ProductID) as DistinctProduct
        FROM Sales.SalesOrderHeader headers
        INNER JOIN Sales.SalesOrderDetail details ON  headers.SalesOrderID = details.SalesOrderID
        group by  DATENAME(dw, OrderDate) 


) as source
PIVOT(
    sum(DistinctProduct) FOR [Day] IN ([Monday], [Tuesday]) 
    )as pivoted
    )  x 

关于sql - 数据透视问题,SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49148576/

相关文章:

带有明细表和事务的 MySQL 存储过程

javascript - 在 Sequelize-cli migrate for MSSQL 上将加密设置为 true

c# - 使用 C# 的 SQL Server 加密/解密

sql - 使用MS SQL修改XML列

php - 用一种形式插入2个表,其中2条sql语句不起作用

带有 WHERE 子句的 JOIN 之后的 SQL WHERE 语句

sql-server - 通过同义词访问时的安全上下文问题

php - 为什么这个简单的连接不起作用? (mysql)

c# - 如何开发负载平衡友好的 Web 应用程序

sql - 获取数据库中所有表的行数: SQL Server