2015-04-22 86 views
1

我在SQL Server 2008环境中使用SQL Server Management Studio中工作2012年SQL多重动态查询到一个查询

我已经写了3个独立的查询

查询1

SQL查询总结所有的现有存货从Inventories

SELECT  StockCode, 
      Sum(QtyOnHand) AS 'SOH' 
FROM  InvWarehouse 
WHERE  StockCode NOT LIKE '%DEM%' AND StockCode NOT LIKE '%REF%' AND StockCode NOT LIKE 'Z%' 
GROUP BY InvWarehouse.StockCode 

查询2

该查询着眼于从采购订单表未来的订单,并动态返回下一个/ 12个月

DECLARE 
@cols AS NVARCHAR(MAX), 
@cols1 AS NVARCHAR(MAX), 
@cols2 AS NVARCHAR(MAX), 
@cols3 AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX) 

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(YearMonth) 
        FROM 

       -- Selecting Using the Destinct -- 

        (SELECT DISTINCT CAST(YEAR([OrderDueDate]) AS NVARCHAR(4)) + RIGHT('00' + CAST(MONTH([OrderDueDate]) AS NVARCHAR(2)),2) AS YearMonth 
        FROM PorMasterHdr 
        JOIN PorMasterDetail 
        ON PorMasterDetail.PurchaseOrder = PorMasterHdr.PurchaseOrder 
        WHERE DATEDIFF(MONTH, OrderDueDate, DATEADD(m,12,GETDATE())) <= 12) sub 

        ORDER BY YearMonth 

        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,''), 

    @cols2 = STUFF((SELECT ',ISNULL(' + QUOTENAME(YearMonth) + ',0) AS ' + QUOTENAME(YearMonth) 
        FROM 

        -- Selecting Using the Destinct -- 

        (SELECT DISTINCT CAST(YEAR([OrderDueDate]) AS NVARCHAR(4)) + RIGHT('00' + CAST(MONTH([OrderDueDate]) AS NVARCHAR(2)),2) AS YearMonth 
        FROM PorMasterHdr 
        JOIN PorMasterDetail 
        ON PorMasterDetail.PurchaseOrder = PorMasterHdr.PurchaseOrder 
        WHERE DATEDIFF(MONTH, OrderDueDate, DATEADD(m,12,GETDATE())) <= 12) sub 

        ORDER BY YearMonth 

        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 


SET @query = ' 
SELECT MStockCode, ' + @cols2 + ' 
FROM (
     SELECT  MStockCode, 
        MOrderQty, 
        CAST(YEAR([OrderDueDate]) AS NVARCHAR(4))+RIGHT(''00''+CAST(MONTH([OrderDueDate]) AS NVARCHAR(2)),2) AS YearMonth 
     FROM PorMasterHdr 
     JOIN PorMasterDetail 
     ON PorMasterDetail.PurchaseOrder = PorMasterHdr.PurchaseOrder 
     WHERE  MStockCode NOT LIKE ''%DEM%'' AND MStockCode NOT LIKE ''%REF%'' AND MStockCode NOT LIKE ''Z%'' 
     ) AS X 
PIVOT (
     SUM(MOrderQty) 
     FOR YearMonth in (' + @cols + ') 
     ) AS PT' 

EXECUTE (@query) 

QUERY 3

这个查询着眼于过去12一个Sales表的销售数据月份并动态返回最近/前12个月

DECLARE 
@cols AS NVARCHAR(MAX), 
@cols1 AS NVARCHAR(MAX), 
@cols2 AS NVARCHAR(MAX), 
@cols3 AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX) 

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(YearMonth) 
        FROM 

       -- Selecting Using the Destinct -- 

        (SELECT DISTINCT CAST([TrnYear] AS NVARCHAR(4)) + RIGHT('00' + CAST([TrnMonth] AS NVARCHAR(2)),2) AS YearMonth 
        FROM ArTrnDetail 
        WHERE DATEDIFF(MONTH, InvoiceDate, GETDATE()) <= 12) sub 

        ORDER BY YearMonth 

        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,''), 

    @cols2 = STUFF((SELECT ',ISNULL(' + QUOTENAME(YearMonth) + ',0) AS ' + QUOTENAME(YearMonth) 
        FROM 

        -- Selecting Using the Destinct -- 

        (SELECT DISTINCT CAST([TrnYear] AS NVARCHAR(4)) + RIGHT('00' + CAST([TrnMonth] AS NVARCHAR(2)),2) AS YearMonth 
        FROM ArTrnDetail 
        WHERE DATEDIFF(MONTH, InvoiceDate, GETDATE()) <= 12) sub 

        ORDER BY YearMonth 

        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 


SET @query = ' 
SELECT StockCode, ' + @cols2 + ' 
FROM (
     SELECT  StockCode, 
        QtyInvoiced, 
        CAST([TrnYear] AS NVARCHAR(4))+RIGHT(''00''+CAST([TrnMonth] AS NVARCHAR(2)),2) AS YearMonth 
     FROM  ArTrnDetail 
     WHERE  StockCode NOT LIKE ''%DEM%'' AND StockCode NOT LIKE ''%REF%'' AND StockCode NOT LIKE ''Z%'' 
     ) AS X 
PIVOT (
     SUM(QtyInvoiced) 
     FOR YearMonth in (' + @cols + ') 
     ) AS PT' 

EXECUTE (@query) 

每个查询的结果都是正确的。现在我该如何将它们组合成一个查询。以便他们返回

STOCKCODE  | Past 12 Month Sales Per Month | Stock On Hand | Future Purchases 

Helicopters | 1 4 5 2 3 4 6 1 3 2 3 2|   15  | 2 3 5 4 6 7 8 4 3 2 8 5 
Jam   | 2 5 6 4 8 5 8 5 7 2 1 2|   30  | 4 5 6 5 8 7 0 1 2 1 1 4 
Frogs   | 2 3 2 4 8 5 4 6 8 2 1 3|   7  | 5 7 8 8 6 7 4 0 1 2 1 2 

上面的股票代码是来自不同表格的相同信息,例如,库存中的直升机与采购订单中的直升机相同。

+0

您可以创建存储过程或创建一个SSRS报告产生上述报告。 – Hiten004

+0

糟糕的模式设计每年/每月都有单独的列。此数据应位于单独的表格中,其中包含年份和月份的列,原始表的主键/ ID的列和值的一列。如果你解决了这个问题,你可以将整个事件放到一个没有动态sql的情况下运行。 –

+0

这是避免动态T-SQL的另一个原因。不过,您可能需要为那些INTO临时表执行结果,以便加入它们。 – Biscuits

回答

0

我建议如下:导致两列

  1. 重写@ QUERY2:StockCode和销售。而不是选择每个月作为一个单独的列,而是在VARCHAR中连接每个月。您已经为@cols编写了一个变量来单独选择列。保持旋转。编写一个变量(@SelSales),将每个月的结果连接到一个VARCHAR中,并将其用于Sales列的选择。
  2. 将@ query3重写为两列:StockCode和Purchases(类似于1)
  3. 将@ query1放入NVARCHAR(MAX)变量(选择股票的变量)。
  4. 编写一个@query将它们全部结合起来。对于@query

TSQL大纲:

DECLARE @query NVARCHAR(MAX); 
SET @query=N' 
SELECT 
    COALESCE(stock.StockCode,sales.StockCode,purchases.StockCode) AS StockCode, 
    COALESCE(sales.Sales,''0 0 0 0 0 0 0 0 0 0 0 0'') AS Sales, 
    COALESCE(stock.SOH,0) AS Stock, 
    COALESCE(purchases.Purchases,''0 0 0 0 0 0 0 0 0 0 0 0'') AS Purchases 
FROM 
    ('[email protected]+') AS stock 
    FULL JOIN ('[email protected]+') AS sales ON sales.StockCode=stock.StockCode 
    FULL JOIN ('[email protected]+') AS purchases ON purchases.StockCode=stock.StockCode'; 
EXEC(@query);