-2

3つのテーブルを作成しました

table 1 ユーザーの販売日を保存する「Sale」
テーブル 2 factorid と productid を保存する「ProductFactor」 表
3 productid と製品名を保存する「Product」

この結果のために3つのテーブルで選択したい:

ユーザーの factorid +price+ saledate + この factorid で有効な製品名を表示

しかし、いつそれを行うか、たとえば、3 つの productid を持つ 1 つの factorid にある場合は、次のように表示されます。

    
    日付 factoreid 名 価格
    2013-09-25 1 1 2000 年
    2013-09-25 1 1 b 3000
    2013-09-25 2 2c 4000
    2013-09-25 3 3 日 3500
    2013-09-25 1 1 e 8000

これを見せたい:

    
    日付 factoreid 名 価格 価格
    2013-09-25 1 1 a,b,ea 価格,b 価格,c 価格 この 3 製品名の合計
    2013-09-25 2 2c 4000
    2013-09-25 3 3 d 3500 私のコードは次のとおりです。
CREATE PROCEDURE [dbo].[GetUserSaleReport] 
    @CurrentUserId uniqueidentifier 
AS BEGIN 

SELECT      dbo.Sale.SaleDate,
            dbo.ProductFactor.FactoreId,
            dbo.Product.ProductName,
            dbo.Product.Price
FROM        Sale 

INNER JOIN  ProductFactor 
    ON      dbo.Sale.FactoreId=dbo.ProductFactor.FactoreId  

INNER JOIN dbo.Product
    ON     dbo.ProductFactor.ProductId=dbo.Product.ProductId  

WHERE      dbo.Sale.UserId = @CurrentUserId 
    AND    dbo.Sale.FactoreId=dbo.ProductFactor.FactoreId
    AND    dbo.ProductFactor.ProductId=dbo.Product.ProductId  

ORDER BY   dbo.Sale.SaleDate 

END
4

1 に答える 1

0

3 つのテーブルすべてを持っているわけではありませんが、このすべてのデータが 1 つのテーブルからのものであると仮定すると、次のようなことができます... すべてのテーブルを結合し、必要なすべてのデータを 1 か所に集めた後、同じログインを適用できます。

SELECT DISTINCT  [DATE], Factoreid, STUFF(T2.NameList, 1, 2, '') AS name, STUFF(T3.PriceList, 1, 2, '') AS price, SUM(Price) PriceSUM
    FROM TableName t 
                OUTER APPLY (
                            SELECT ', ' + name [text()]
                            FROM TableName 
                            WHERE Factoreid = t.Factoreid
                            FOR XML PATH('')
                            ) T2(NameList)
                OUTER APPLY (
                            SELECT  ', ' + CAST(price AS VARCHAR) [text()]
                            FROM TableName 
                            WHERE Factoreid = t.Factoreid
                            FOR XML PATH('')
                            ) T3(PriceList)
    GROUP BY [DATE], Factoreid, STUFF(T2.NameList, 1, 2, ''), STUFF(T3.PriceList, 1, 2, '')

私はそれがうまくいくと思うコードを微調整しようとしましたこれを試してください

CREATE PROCEDURE [dbo].[GetUserSaleReport] 
@CurrentUserId uniqueidentifier 
AS BEGIN 
    SET NOCOUNT ON;

IF OBJECT_ID('tempdb..#Temptable') IS NOT NULL
DROP TABLE #Temptable    

SELECT      dbo.Sale.SaleDate           AS [DATE],
            dbo.ProductFactor.FactoreId AS Factoreid,
            dbo.Product.ProductName     AS Name,
            dbo.Product.Price           AS Price
        INTO #Temptable
FROM        Sale 

INNER JOIN  ProductFactor 
    ON      dbo.Sale.FactoreId=dbo.ProductFactor.FactoreId  

INNER JOIN dbo.Product
    ON     dbo.ProductFactor.ProductId=dbo.Product.ProductId  

WHERE      dbo.Sale.UserId = @CurrentUserId 
    AND    dbo.Sale.FactoreId=dbo.ProductFactor.FactoreId
    AND    dbo.ProductFactor.ProductId=dbo.Product.ProductId  

ORDER BY   dbo.Sale.SaleDate 

SELECT DISTINCT  [DATE], Factoreid, STUFF(T2.NameList, 1, 2, '') AS name, STUFF(T3.PriceList, 1, 2, '') AS price, SUM(Price) PriceSUM
FROM #Temptable t 
            OUTER APPLY (
                        SELECT ', ' + Name [text()]
                        FROM #Temptable 
                        WHERE Factoreid = t.Factoreid
                        FOR XML PATH('')
                        ) T2(NameList)
                OUTER APPLY (
                            SELECT  ', ' + CAST(price AS VARCHAR) [text()]
                            FROM #Temptable 
                            WHERE Factoreid = t.Factoreid
                            FOR XML PATH('')
                            ) T3(PriceList)
GROUP BY [DATE], Factoreid, STUFF(T2.NameList, 1, 2, ''), STUFF(T3.PriceList, 1, 2, '')

IF OBJECT_ID('tempdb..#Temptable') IS NOT NULL
DROP TABLE #Temptable   

  SET NOCOUNT OFF;

END
于 2013-10-10T20:58:03.443 に答える