2012-04-04 63 views
0

我无法输出的SQL SELECT语句我的XML用于我的图表简单的SQL SELECT INTO GRAPH

我有这些结果

December 2011470​​

January 2012434​​

February 2012278​​

February 20122STORESID

我需要输出他们像这样的,所以我可以循环我的代码,并生成XML

Month YearFRESNIUSSTORESID

December 20114700

January 20124340

February 20122782

注意一下我不包括头,这些都是列结果。 以及STORESID和FRESNIUS不是静态值。多个存储库存在,所以我需要动态地扩展我的列数。

我有点需要输出第二个来正确生成XML,通过我已经有的PHP。或者还有其他任何适当的方式。

谢谢。

查询下面的输出我谈论

 
SELECT 
     DATENAME(month, orderdate) + ' ' + CAST(Year(orderdate) AS VARCHAR(4)) AS 'Month Year' , 
     count(*) 'Number of Orders', 
     storerkey 
FROM orders 
GROUP BY 
     storerkey, 
     DATENAME(month, orderdate) + ' ' + CAST(Year(orderdate) AS VARCHAR(4)), 
     CAST(Year(orderdate) AS VARCHAR(4)) + RIGHT('0' + CAST(Month(orderdate) AS VARCHAR(2)),2) 
ORDER BY  
     storerkey, 
     CAST(Year(orderdate) AS VARCHAR(4)) + RIGHT('0' + CAST(Month(orderdate) AS VARCHAR(2)),2) 

    

回答

1

我不是100%确定需要的XML输出,但可以利用SQL-Servers FOR XML clause和PIVOT功能。这应该让你开始:

CREATE TABLE #Test (GraphDate DATETIME, Value INT, Type VARCHAR(50)) 
INSERT #Test VALUES 
    ('01/12/2011', 470, 'FRESENIUS'), 
    ('01/01/2012', 434, 'FRESENIUS'), 
    ('01/12/2012', 278, 'FRESENIUS'), 
    ('01/02/2012', 2, 'STORESID') 

SELECT DATEPART(YEAR, GraphDate) [Year], 
     DATENAME(MONTH, GraphDate) [Month], 
     ISNULL(FRESENIUS, 0) [FRESENIUS], 
     ISNULL(STORESID, 0) [STORESID] 
FROM #Test 
     PIVOT 
     ( SUM(Value) 
      FOR Type IN ([FRESENIUS], [STORESID]) 
     ) PivotTable 
FOR XML PATH('row'), ROOT 

DROP TABLE #Test 

编辑

以下是您所要求的基础上,你已经给查询的基本查询。

SELECT DATENAME(MONTH, OrderDate) + ' ' + DATENAME(YEAR, OrderDate) [MonthYear], 
     ISNULL(FRESENIUS, 0) [FRESENIUS], 
     ISNULL(STORESID, 0) [STORESID] 
FROM Orders 
     PIVOT 
     ( COUNT(StorerKey) 
      FOR StorerKey IN ([FRESENIUS], [STORESID]) 
     ) PivotTable 
ORDER BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate) 

EDIT 2

我不认为PIVOT由SQL-Server 2000的支持,您将需要使用聚合函数:

SELECT DATENAME(MONTH, OrderDate) + ' ' + DATENAME(YEAR, OrderDate) [MonthYear], 
     COUNT(CASE WHEN StorerKey = 'FRESENIUS' THEN 1 END) [FRESENIUS], 
     COUNT(CASE WHEN StorerKey = 'STORESID' THEN 1 END) [STORESID] 
FROM Orders 
GROUP BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate), DATENAME(YEAR, OrderDate), DATENAME(MONTH, OrderDate) 
ORDER BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate) 

我觉得有些FOR XML功能仍然可用,因此您仍然可以直接从SQL中输出您的XML。


编辑3

DECLARE @SQL NVARCHAR(2000) 
SELECT @SQL = ISNULL(@SQL, '') + ', COUNT(CASE WHEN StorerKey = ''' + StorerKey + ''' THEN 1 END) [' + StorerKey + ']' 
FROM ( SELECT DISTINCT StorerKey 
      FROM Orders 
     ) Keys 


SET @SQL = 'SELECT DATENAME(MONTH, OrderDate) + '' '' + DATENAME(YEAR, OrderDate) [MonthYear]' + @SQL + 
      ' FROM Orders 
      GROUP BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate), DATENAME(YEAR, OrderDate), DATENAME(MONTH, OrderDate) 
      ORDER BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate)' 

EXECUTE SP_EXECUTESQL @SQL 
+0

为MSSQL 2000做这项工作? – Sid 2012-04-04 09:30:22

+0

添加了编辑。我不认为'PIVOT'是MSSQL 2000支持的,所以我添加了一个替代(编辑2)。 – GarethD 2012-04-04 09:37:43

+0

编辑2的作品。但只有且仅在STORESID和FRESNIUS是专栏的情况下。我忘了提及我会将这个用于不同的程序,而不仅仅是关注订单表。而不同的客户有不同的存储键。 – Sid 2012-04-04 09:43:05

1

你可以加入表本身。如果我作出关于列名的假设,认为无论是FRESNIUS或STORESID可能是不存在的,并使用公共表表达式(未经测试!):

WITH date_fresnius AS (
    SELECT [Month Year], FRESNIUS 
    FROM original_table 
) 
, date_storesid AS (
    SELECT [Month Year], STORESID 
    FROM original_table 
) 
SELECT 
     ISNULL(f.[Month Year], s.[Month Year]) AS [Month Year] 
    , ISNULL(f.FRESNIUS, 0) AS FRESNIUS 
    , ISNULL(s.STORESID, 0) AS STORESID 
FROM 
    date_fresnius f 
    FULL OUTER JOIN date_storesid s ON (f.[Month Year] = s.[Month Year]) 

如果你总是有你可以使用LEFT JOIN一个FRESNIUS记录代替。

+0

对不起,我没有完全得到这个。生病尝试显示我的选择 – Sid 2012-04-04 09:09:46

1

根据您的查询:

SELECT 
    DATENAME(MONTH, orderdate) + ' ' + CAST(YEAR(orderdate) AS VARCHAR(4)) AS [Month Year] 
    COUNT(CASE storerkey WHEN 'FRESNIUS' THEN 1 END) AS FRESNIUS, 
    COUNT(CASE storerkey WHEN 'STORESID' THEN 1 END) AS STORESID 
FROM orders 
GROUP BY YEAR(orderdate), MONTH(orderdate), DATENAME(MONTH, orderdate) 
ORDER BY YEAR(orderdate), MONTH(orderdate) 

输出:

Month Year  FRESNIUS STORESID 
December 2011  470   0 
January 2012   434   0 
February 2012  278   2 
+0

只有当STORESID和FRESNIUS是需要的列时才有效。提到我会将它用于不同的程序,而不仅仅是关注订单表,而不同的客户有不同的storerskey。我也可以有多个存储器,这就是为什么我这样做的原因。 – Sid 2012-04-04 09:44:09