0

グラフに使用するSQLSelectステートメントをXMLに出力するのに問題があります

私はこれらの結果を持っています

December 2011 470 FRESENIUS

January 2012 434 FRESENIUS

February 2012 278 FRESENIUS

February 2012 2 STORESID

コードをループしてXMLを生成できるように、このように出力する必要があります

Month Year FRESNIUS STORESID

December 2011 470 0

January 2012 434 0

February 2012 278 2

ヘッダーを含めなかったことに注意してください。これらはすべて列の結果です。また、STORESIDとFRESNIUSは静的な値ではありません。複数のストアが存在するため、列の数も動的に拡張する必要がありました。

すでに持っているPHPを介してXMLを適切に生成するには、2番目のものを出力する必要があります。または、他の適切な方法はありますか。

ありがとう。

私が話していた出力については、以下のクエリ

選択する  
        DATENAME(月、注文日)+'' + CAST(年(注文日)AS VARCHAR(4))AS'月年'、
        count(*)'注文数'、
        storerkey
注文から
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)
注文者    
        storerkey、
        CAST(Year(orderdate)AS VARCHAR(4))+ RIGHT( '0' + CAST(Month(orderdate)AS VARCHAR(2))、2)

        
4

3 に答える 3

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
于 2012-04-04T09:28:27.863 に答える
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])

常に FRESNIUS レコードがある場合は、代わりに LEFT JOIN を使用できます。

于 2012-04-04T09:04:06.290 に答える
1

必要な XML 出力が 100% 確実というわけではありませんが、SQL Server の FOR XML 句と 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)

編集2

SQL-Server 2000 ではサポートされていないと思いPIVOTます。集計関数を使用する必要があります。

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
于 2012-04-04T09:08:35.663 に答える