2012-02-28 11 views
1

これまでも同様の質問がされている可能性がありますが、見つけられません。だからここに私の目的です。 私は1.Bill 2.BillDetail 3.ExpenseInfoのような3つのテーブルを持っています。テーブル「Bill」は、テーブル「BillDetail」の外部キーである「BillID」という名前の主キーを有する。同様に、テーブル「ExpenseInfo」はPK「ExpenseID」を有し、これもまた「BillDetail」に対するFKである。これらの表に保管されているデータは、以下の形式です。 For 1 entry in Bill table, there might be 1 or more rows in BillDetail table where each row contains 1 ExpenseID。今、私はここに燃料をlike-sqlクエリを使用して、詳細テーブルから縦方向のデータを水平方向に選択するにはどうすればよいですか?

BillID BillDate Fuel Food Travel 
    1 28-02-12 10 20 50 

データに何かを選択しますクエリを書きたい、食べ物、旅行は「ExpenseInfo」テーブルに保存された様々な経費タイプです。私は以下を試しました。これを行うには正しい方法や他のスマートな方法がありますか?

SELECT * 
FROM t_BillInfoDetail a 
LEFT OUTER JOIN 
(
SELECT ISNULL(ExpenseID,0) AS ExpenseID, ISNULL(ExpenseName,'N/A') AS ExpenseName  
FROM t_expenseinfo 
WHERE ExpenseID=1 
) AS LocalTravel ON a.ExpenseID = LocalTravel.ExpenseID 

新しく追加されました あなたのお返事ありがとうございます。 現在私は私の目的のために以下のようにしています。あなたがそれを好きだと思います。

SELECT 
BI.* , BID.ExpenseID, BID.BillDescription, BID.LocalTravel, BID.LocalHotel, BID.Fuel 
FROM 
(
SELECT * 
FROM t_BillInfo 
WHERE BillID = 1 
) AS BI 
LEFT OUTER JOIN 
(
SELECT BillID, BillDescription, ExpenseID, 
    ISNULL(SUM(CASE ExpenseID WHEN 1 THEN Amount ELSE 0 END), 0) AS LocalTravel, 
    ISNULL(SUM(CASE ExpenseID WHEN 2 THEN Amount ELSE 0 END), 0) AS LocalHotel, 
    ISNULL(SUM(CASE ExpenseID WHEN 3 THEN Amount ELSE 0 END), 0) AS Fuel 
FROM t_BillInfoDetail 
GROUP BY BillID, BillDescription, ExpenseID 
) AS BID ON BI.BillID = BID.BillID 

答えて

1

たぶん私は質問権を得ていないんだけど、私はそれを見るように、あなたは3つのテーブルは、「チェーン」Bill -HAS_MANY> BillDetail -HAS_ONE> ExpenseInfoのように参加しています。

この場合、必要な各テーブルのデータを要求する内部結合を使用してテーブルを結合するだけです。あなたはテーブル構造を用意していませんが、このようにしてください:

select b.aBillField, bd.aBillDetailField, ei.aExpenseInfoField from bill b 
inner join billDetail bd 
on b.billID = bd.billFK 
inner join expenseInfo ei 
on ei.expenseFK = bd.billDetailId 
where expenseId = 1 

もちろん、発明されたフィールドを対応するフィールドに置き換えてください。場合

+0

あなたの考えに感謝します。私は道を見つけた。 –

0

uは店の手続きを必要とし、uはあなたの質問に、より明確にすることができれば、我々は簡単にあなたに答えることができれば...今のあなたはuが何らかのエラーがある場合は、この

create procedure [dbo].[SP_GetInfo] 
    (
    @ExpenseID int 
    ) 
    as 
    begin 
    select Bill .BillID , BillDetail .BillDate , ExpenseInfo.Fuel 
    from Bill , BillDetail , ExpenseInfo 
    where Bill .BillID = BillDetail .BillID  
    AND ExpenseInfo.ExpenseID [email protected] 
GO 

はこれを試してみてください私に尋ねてください....

0

私が正しく読んだら、PIVOTあなたのデータをExpenseInfoテーブルに入れます。以下を試してください:

SELECT BillID, 
     BillDate, 
     Fuel, 
     Food, 
     Travel 
FROM (SELECT BillID, 
       BillDate, 
       ExpenseName, 
       ExpenseAmount 
     FROM Bill AS B 
       INNER JOIN BillDetail BD 
       ON B.BillID = BD.BillID 
       INNER JOIN ExpenseInfo EI 
       ON BD.ExpenseID = EI.ExpenseID) AS up PIVOT (SUM(ExpenseAmount 
     ) FOR 
     ExpenseName IN (Fuel, Food, Travel)) AS pvt 
ORDER BY BillID 
+0

ご返信ありがとうございます。しかし、MS SQL Server 2000(Ent。Edition)を使用しているので、確認できませんでした。 –

0

これは私が使用しているものです。それは私の要求を満たす。

SELECT 
BI.* , BID.ExpenseID, BID.BillDescription, BID.LocalTravel, BID.LocalHotel, BID.Fuel 
FROM 
(
SELECT * 
FROM t_BillInfo 
WHERE BillID = 1 
) AS BI 
LEFT OUTER JOIN 
(
SELECT BillID, BillDescription, ExpenseID, 
    ISNULL(SUM(CASE ExpenseID WHEN 1 THEN Amount ELSE 0 END), 0) AS LocalTravel, 
    ISNULL(SUM(CASE ExpenseID WHEN 2 THEN Amount ELSE 0 END), 0) AS LocalHotel, 
    ISNULL(SUM(CASE ExpenseID WHEN 3 THEN Amount ELSE 0 END), 0) AS Fuel 
FROM t_BillInfoDetail 
GROUP BY BillID, BillDescription, ExpenseID 
) AS BID ON BI.BillID = BID.BillID 
関連する問題