简体   繁体   English

如何使用SQL将单行拆分为多行

[英]How to split a single row into multiple rows using SQL

My T-SQL code selects information concerning college debt amounts from a table. 我的T-SQL代码从表格中选择有关大学债务金额的信息。 The code itself works, but I need to break the single row up. 代码本身可以工作,但是我需要将单行拆分。 There are 4 rows, one for each debt level. 有4行,每个债务级别一个。 I'm probably missing something simple at this point. 我现在可能缺少一些简单的东西。

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%'

Right now it reads as 现在它读为

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

But it needs to read as 但是它需要读为

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

Like this: 像这样:

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%'

I suppose you could do this as well: 我想您也可以这样做:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM