2017-08-13 100 views
-1

使用AdventureWorks2008R2SQL获得总订单从CTE声明

我:

With CTE As 
( 
Select 2005 As [Year] 
Union 
Select 2006 
Union 
Select 2007 
Union 
Select 2008 
) 
Select * From CTE 

这会给我的年(行)二〇〇四年至2008年:

2005 
2006 
2007 
2008 

现在,我要将每年的总订单插入到这些行中。

将下面的代码给我订单总额:

WITH CTE 
AS 
(
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS [Year] 
    FROM Sales.SalesOrderHeader 
) 
SELECT COUNT(SalesOrderID) AS TotalOrders 
FROM CTE 
GROUP BY [Year] 

我应该如何编写它(像INSERT INTO)?

enter image description here

+1

为什么在按年份(订单日期)做简单分组时会使用cte? BTW不应该被标记为sqlserver? –

+0

这种情况下你不应该使用CTE。它不必要地更复杂和更常见的捷径。如果有人遇到这段代码,他会查找你的意思和递归隐藏的地方。 – Deadsheep39

回答

0

你可以使用:

WITH cte AS 
( 
    Select 2005 AS [Year] UNION 
    Select 2006 UNION 
    Select 2007 UNION 
    Select 2008 
) 
SELECT c.[Year], COUNT(soh.*) AS TotalOrders 
FROM cte c 
LEFT JOIN Sales.SalesOrderHeader soh 
    ON c.[Year] = YEAR(soh.OrderDate) 
GROUP BY c.[Year] 
ORDER BY c.[Year]; 

如果您确信每年有数据使用简单:

SELECT YEAR(soh.OrderDate), COUNT(*) AS TotalOrders 
FROM Sales.SalesOrderHeader soh 
WHERE soh.OrderDate >= '20050101' AND soh.OrderData < '20090101' 
GROUP BY YEAR(soh.OrderDate) 
ORDER BY YEAR(soh.OrderDate); 
0

试试这个:

insert into table(col1,col2) 
SELECT year,COUNT(SalesOrderID) AS TotalOrders 
FROM (
SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS [Year] 
    FROM Sales.SalesOrderHeader) as t1 
GROUP BY Year 
0
INSERT INTO table_name (year_col,total_order_col) 
SELECT YEAR(OrderDate) AS [Year] ,COUNT(1) AS Total_Orders 
FROM Sales.SalesOrderHeader 
GROUP BY YEAR(OrderDate)