2017-08-18 6 views
0

T-SQLコードでは、大学の借金金額に関する情報を表から選択します。コード自体は機能しますが、1行を分割する必要があります。 4つの行があり、各債務レベルに1つずつあります。私はおそらくこの時点で単純なものを見逃しているでしょう。SQLを使用して単一の行を複数の行に分割する方法

USE [College Database] 
GO 


DECLARE @P10W FLOAT, @P25W FLOAT, @P75W FLOAT, @P90W FLOAT, @P10A FLOAT, @P25A FLOAT, @P75A FLOAT, @P90A FLOAT 

SELECT @P10W = CONVERT(DECIMAL(6,0),SUM(CUML_DEBT_P10*CUML_DEBT_N)/SUM(CUML_DEBT_N)), 
@P25W = CONVERT(DECIMAL(6,0),SUM(CUML_DEBT_P25*CUML_DEBT_N)/SUM(CUML_DEBT_N)), 
@P75W = CONVERT(DECIMAL(6,0),SUM(CUML_DEBT_P75*CUML_DEBT_N)/SUM(CUML_DEBT_N)), 
@P90W = CONVERT(DECIMAL(6,0),SUM(CUML_DEBT_P90*CUML_DEBT_N)/SUM(CUML_DEBT_N)) 
FROM CollegeInfo 

SELECT 
@P10A = CONVERT(DECIMAL(6,0),AVG(CUML_DEBT_P10)), 
@P25A = CONVERT(DECIMAL(6,0),AVG(CUML_DEBT_P25)), 
@P75A = CONVERT(DECIMAL(6,0),AVG(CUML_DEBT_P75)), 
@P90A = CONVERT(DECIMAL(6,0),AVG(CUML_DEBT_P90)) 
From CollegeInfo 

SELECT '10% Debt Level', 
CUML_DEBT_P10 AS 'Institution', 
@P10A AS 'Average', 
@P10W AS ' Weighted Average' , 
'25% Debt Level', 
CUML_DEBT_P25 AS 'Institution', 
@P25A AS 'Average', 
@P25W AS ' Weighted Average' , 
'75% Debt Level', 
CUML_DEBT_P75 AS 'Institution', 
@P75A AS 'Average', 
@P75W AS ' Weighted Average' , 
'90% Debt Level', 
CUML_DEBT_P90 AS 'Institution', 
@P90A AS 'Average', 
@P90W AS ' Weighted Average' 
FROM CollegeInfo 
WHERE INSTNM LIKE'%Alabama A & M%' 

今、それは

10% Debt Level 4750 3530 2816 25% Debt Level 9500 6243 5990 75% Debt Level 37900 18543 27976 90% Debt Level 50114 25147 39153 

として読み込み、しかし、それは

このよう
10% Debt Level 4750 3530 2816  
25% Debt Level 9500 6243 5990  
75% Debt Level 37900 18543 27976 
90% Debt Level 50114 25147 39153 
+0

4つのselect文と 'UNION ALL'を使用します。金額が別々の行にあるため、LoanTypeを配置する必要があるようです。 – xQbert

+0

UNION ALLを使用するコードをどのくらい正確に変更できますか? 行情報は、 "xx%Debt Level"、 " – user7143384

+0

と表示されていますが、私は組合はうまくいくと思いますが、すべてのユーザー変数を使わない方が良い方法かもしれません。それについて考える必要があるだけです。問題は、あなたがレベルの複数の列を持っているという事実で、collegeInfo内に1:Mの関係があることです。これが正規化されていれば、4列ではなく4行になります。したがって、私は組合がすべてのアプローチが適切だと思う。私は4倍の値を持つテーブルへのクロス結合を考え、maxとgroup byを使用していましたが、それがあなたの合計に何をするのかは分かりませんでした。 – xQbert

答えて

0

として読み込む必要がある:私はあなたにもこれを行うことが想定

SELECT '10% Debt Level' 
    , CUML_DEBT_P10 AS 'Institution' 
    , @P10A AS 'Average' 
    , @P10W AS ' Weighted Average' 
FROM CollegeInfo 
WHERE INSTNM LIKE'%Alabama A & M%' 

UNION ALL 
SELECT'25% Debt Level', 
    , CUML_DEBT_P25 AS 'Institution' 
    , @P25A AS 'Average' 
    , @P25W AS ' Weighted Average' 
FROM CollegeInfo 
WHERE INSTNM LIKE'%Alabama A & M%' 

UNION ALL 
SELECT '75% Debt Level' 
    , CUML_DEBT_P75 AS 'Institution' 
    , @P75A AS 'Average' 
    , @P75W AS ' Weighted Average' 
FROM CollegeInfo 
WHERE INSTNM LIKE'%Alabama A & M%' 

UNION ALL 
SELECT '90% Debt Level' 
    , CUML_DEBT_P90 AS 'Institution' 
    , @P90A AS 'Average' 
    , @P90W AS ' Weighted Average' 
FROM CollegeInfo 
WHERE INSTNM LIKE'%Alabama A & M%' 

WITH CTE AS (
SELECT '10% Debt Level' debtLevel, 
CUML_DEBT_P10 AS 'InstitutionA', 
@P10A AS 'AverageA', 
@P10W AS [Weighted AverageA] , 
'25% Debt Level', 
CUML_DEBT_P25 AS 'InstitutionB', 
@P25A AS 'AverageB', 
@P25W AS [Weighted AverageB] , 
'75% Debt Level', 
CUML_DEBT_P75 AS 'InstitutionC', 
@P75A AS 'AverageC', 
@P75W AS [Weighted AverageC] , 
'90% Debt Level', 
CUML_DEBT_P90 AS 'InstitutionD', 
@P90A AS 'AverageD', 
@P90W AS [Weighted AverageD] 
FROM CollegeInfo 
WHERE INSTNM LIKE'%Alabama A & M%') 

SELECT B.DL 
    , max(CASE WHEN B.DL='10% Debt Level' THEN CTE.InstitutionA 
       WHEN B.DL='25% Debt Level' THEN CTE.InstitutionB 
       WHEN B.DL='75% Debt Level' THEN CTE.InstitutionC 
       WHEN B.DL='90% Debt Level' THEN CTE.InstitutionD END) as Institution 
    , max(CASE WHEN B.DL='10% Debt Level' THEN CTE.AverageA 
       WHEN B.DL='25% Debt Level' THEN CTE.AverageB 
       WHEN B.DL='75% Debt Level' THEN CTE.AverageC 
       WHEN B.DL='90% Debt Level' THEN CTE.AverageD END) as Average 
    , max(CASE WHEN B.DL='10% Debt Level' THEN CTE.[Weighted AverageA] 
       WHEN B.DL='25% Debt Level' THEN CTE.[Weighted AverageB] 
       WHEN B.DL='75% Debt Level' THEN CTE.[Weighted AverageC] 
       WHEN B.DL='90% Debt Level' THEN CTE.[Weighted AverageD] END) as WeightedAverage 
FROM CTE 
CROSS JOIN (SELECT '10% Debt Level' DL UNION ALL 
      SELECT '25% Debt Level' UNION ALL 
      SELECT '75% Debt Level' UNION ALL 
      SELECT '90% Debt Level') B 
GROUP BY B.DL 
+0

助けてくれてありがとう、私はちょうど同様に働いているカーソルセクションを取得する必要があります。 – user7143384

+0

Oi ... RDBMSは、レコードセットでレコードを処理しないときに最も効果的です。カーソルは約5%の時間が必要です。残りの時間ベースのプロセスはより良く動作します。あなたのケースは5%であるかもしれませんが、それはセットで実行できる時間の95%です:P – xQbert

関連する問題