Transposing Table Data From Rows to Columns Into a View

I have a web-based HRMS (Human Resources Management System) ERP with a back-end SQL Server 2008 R2. I'm trying to compare the actual manpower with the manpower contract requirements for 30 cost centers. My base data is as follows:
TABLE Contract_Requirements: Class, Cost_Center, Contract_Qty
VIEW Manpower_Count: Class, Cost_Center, Head_Count
I would like to transpose the rows to columns of both objects so that the end result would be similar to the following:
          Class          |          Site_1          |         
Site_2          |          Site_3          |          Site_4         
|...
Superintendent                   1                              
1                             1                            
1
Supervisor                           2                              
2                             2                            
2
Medic                                   1                              
2                             1                            
3
Crane Operator                   1                              
1                             2                            
1
The target layout is that each individual record displays the number of employees of a specific class allocated to each individual cost center; the cost centers become columns. I was able to accomplish this using the following TSQL:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(Cost_Center)
FROM Manpower_Count
GROUP BY Cost_Center
ORDER BY Cost_Center
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'),1,1,'')
SET @query = 'SELECT Class,' + @cols + ' INTO
Manpower_Allocation_Matrix FROM
(SELECT Class, Cost_Center, Head_Count
FROM Manpower_Count) x
PIVOT (SUM(Head_Count) FOR Cost_Center IN (' + @cols + '))p'
EXECUTE(@query);
The only problem is if an employee is transferred from one cost center to another, which happens a lot on a daily basis, this would only be reflected in the base view; the resultant table will not be updated. I would have to repeatedly drop and recreate
the table which isn't efficient, nor is it the right practice. I was thinking of automating this using a scheduled procedure every day, but it's still not going to work. The actual manpower count must be known at real-time, meaning any changes should be reflected
immediately after any employee transfer. What is the most efficient way to automate this process and store real-time data? FYI, I'm not an SQL expert and have never worked with
stored procedures or triggers. I would also like to point out the number of cost centers is never fixed; consequently the number of columns aren't fixed either.

Hi Seif,
You can pivot straightly on the base view to get real time data. The dynamic PIVOT is encapsuled in a Stored Procedure(SP), so every time your want to check the manpower count you can call the SP.
--This table is the same with your base view
CREATE TABLE srcTbl(
Employee_Code VARCHAR(99),
Employee_Name VARCHAR(99),
Cost_Center_name VARCHAR(99),
Cost_Center_NO VARCHAR(99),
Position_ VARCHAR(99),
Total_Salary Money
INSERT INTO srcTbl VALUES('CAN-010','John Doe A','Site 120',120,'Fork Lift Operator',150);
INSERT INTO srcTbl VALUES('EGY-130','John Doe B','Site 150',150,'Driver',200);
INSERT INTO srcTbl VALUES('IND-120','John Doe C','Site 113',113,'Fork Lift Operator',150);
INSERT INTO srcTbl VALUES('SAU-50','John Doe D','Site 112',112,'Mechanic',261.948);
INSERT INTO srcTbl VALUES('PHI-90','John Doe F','Site 112',112,'Crane Operator',250);
INSERT INTO srcTbl VALUES('CAN-012','John Doe G','Site 120',120,'Driver',200);
INSERT INTO srcTbl VALUES('IND-129','John Doe I','Site 150',150,'Superintendent',2300);
INSERT INTO srcTbl VALUES('PAK-464','John Doe X','Site 141',141,'Supervisor',1800);
INSERT INTO srcTbl VALUES('FRA-003','John Doe M','Site 120',120,'Medic',700);
GO
CREATE PROC proc1
AS
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(Cost_Center_no)
FROM srcTbl
GROUP BY Cost_Center_no
ORDER BY Cost_Center_no
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')
SET @query=N';WITH Cte AS(
SELECT Position_ as Class,Cost_Center_No, COUNT(1) AS Head_Count FROM srcTbl
GROUP BY Position_,Cost_Center_No
SELECT Class,'+@cols+'
FROM Cte
PIVOT
(MAX(Head_Count) FOR Cost_Center_No IN('+@cols+')) AS PvtTbl
ORDER BY Class';
EXEC sp_executesql @query ;
GO
EXEC PROC1
DROP PROC PROC1
DROP TABLE srcTbl
If you have any question, feel free to let me know.
Eric Zhang
TechNet Community Support

Similar Messages

  • How to convert a table data from rows to columns?

    Hi,
    I have a Employee table of the following format:
    Emp_id | Emp_name | Salary
    101 | James | 1000
    102 | Julia     | 2000
    I have to convert or transpose the table data as follows using a SQL statement/function -
    Emp_id | 101     |     102
    Emp_name | James |     Julia
    Salary     | 1000 |     2000
    How do I achieve this?
    Please help me.
    Thanks,
    993012
    Edited by: 993012 on Mar 11, 2013 3:26 AM

    993012 wrote:
    Hi Pavan,
    Thanks for the prompt reply.
    The link seems to be of not relevant to my question.
    My question is to clearly transpose the rows to columns and vice versa without any changes to data.
    Regards,
    993012I do not see any modification to the data in the Link posted by Pavan. Anyways, One catch with Transposing the Rows is, you need to know the Number of Columns you need to project.
    With Static SQL, there is no way to do so. Hence, you will need PL/SQL with Execute Immediate/Dynamic SQL.
    See demostration by Tom Kyte on Dynamic Pivots to have a look at the example and adapt to your situation.
    Although, I will debate on the need to do it in SQL. Because what you are upto is a part of Reporting and there are many reporting Tools which will have this functionality in-built. SQL, ideally should not be used for reporting purposes. It sole purpose it to store and pass the data to be rendered by Client Software i.e. Java or Third Party tools.

  • How to transpose the data records (rows) to column(lists) using apd

    Hi,
      how to transpose the data records (rows) to column (lists) using apd  in sap bw.
    I do not want to use abap routine.only use the transpose rows to list  transformation .
    Pls provide the step by step procedure .
    thanks,
    Nimai

    Save youe file to transpose as a csv and in the header row of your file for the columns you want to transpose you need to put some soer of a tag before the column name (ie your colum header was for a period budget will be something lie 2011001:ZFIBDD)
    1. You will need to create a new apd process (rsanwb)
    2. Insert a "Read from Data File" data source object and map it file (,csv)
    3. insert a transpose object into your apd process (middle row 4th one over in the transformations section)
    4. under the definition tab in the transformation object select all the columns that are to be transposed into rows and move them to the transformed area, the grouping fields section should contain the rows that you want to now be columns
    5.under the transformation tab enter in the seperator you selected  under the Field Name/Infoobject area (ie. ZFIBDD)
    6. under the details tab  you need to enter in all the fields to be transformed and tner the transposition field (ie ZFIBDD)
    7. Then you can insert a set of transformations and a DSO and link the newly transposed fields into that.
    hope that helps

  • How to extract data from xml and insert into Oracle table

    Hi,
    I have a large xml file. which will have hundreds of the following transaction tags having column names and there values.
    There is a table one of the schema with coulums "actualCostRate","billRate"....etc.
    I need to extract the values of these columns and insert into the table
    <Transaction actualCostRate="0" billRate="0" chargeable="1" clientID="NikuUK" chargeCode="LCOCD1" externalID="L-RESCODE_UK1-PROJ_UK_CNT_GBP-37289-8" importStatus="N" projectID="TESTPROJ" resourceID="admin" transactionDate="2002-02-12" transactionType="L" units="11" taskID="5017601" inputTypeCode="SALES" groupId="123" voucherNumber="ABCVDD" transactionClass="ABCD"/>
    <Transaction actualCostRate="0" billRate="0" chargeable="1" clientID="NikuEU" chargeCode="LCOCD1" externalID="L-RESCODE_US1-PROJ_EU_STD2-37291-4" importStatus="N" projectID="TESTPROJ" resourceID="admin" transactionDate="2002-02-04" transactionType="L" units="4" taskID="5017601" inputTypeCode="SALES" groupId="124" voucherNumber="EEE222" transactionClass="DEFG"/>

    Re: Insert from XML to relational table
    http://www.google.ae/search?hl=ar&q=extract+data+from+xml+and+insert+into+Oracle+table+&btnG=%D8%A8%D8%AD%D8%AB+Google&meta=

  • Load XML data from UNIX Server Directly into Relational Database Tables

    Is there a way I can load data from an XML File into Oracle Tables , without having the Input XML file in some Oracle Server Directory. My XML File resides on UNIX Application server. And I need to directly load the data into Database tables. Without loading them into the Database Directory.
    Also I am looking for a solution that would not load my Database much and effect other running processes. Can it be done using SQL Loader ?
    Oracle Database Version is : Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

    Thanks for your reply ,
    Please would you quote an Example about : 'Load the file into that table using SQL*Loader'  (From UNIX Server) Or instance of some existing thread that relates to my situation.
    The Size of the File would be about 3 GB. For a similar requirement one of my peers Code which used XMLTABLE and XPATH Approach consumed a lot of resources while running and caused the other Database Applications to slow down. Thus those guys have come up with an approach to :
            Parse XML using a C Code using some STRING Functions =>  For a CSV or Fixed width .dat file and then use SQL Loader to just load the file into Tables.
            This approach is efficient in terms of Resources and Time(Takes 5 mins). But I am not confident about parsing XML based on String based C Functions.
             Please comment about this approach . Also if possible Suggest the best efficient way of doing this.

  • Converting key figures from rows to column using DSO and start routine

    Hi SDNer:
    I need some help to convert key figures from rows to column.
    The source is DSO 1 and I am thinking about writing ABAP in the start routine to do the conversion. The target is DSO2.
    Below is the  more detail information with example. Basically, for each record in DSO 1 I need to create 3 records (because there are 3 KF's) and output to DSO2.
    I would really appreciate some help on this.Thank you.
    Tony
    DSO 1 data format (SOURCE)
    Period   ID   KF1  KF2  KF3
    200702 100  300  200   750
    Output to DSO 2 (TARGET)
    Period   ID    KF  LABEL
    200702 100  300  KF1
    200702 100  200  KF2
    200702 100  750  KF3

    This is the code in BI 7.0.
    u need to put a field "Label" in DSO1. u dont need to populate this in DSO1 but it helps the code to populate the field in DSO2.
    DATA: wa_result TYPE _ty_s_sc_1,
    t_result TYPE STANDARD TABLE OF _ty_s_sc_1.
    DATA:counter(2) TYPE n.
    LOOP AT SOURCE_PACKAGE INTO wa_result.
    counter =0.
    while counter < 3 .
    wa_result- Period = wa_result-Period.
    wa_result- ID = wa_result-ID.
    if counter  = 0.
    wa_result- KF1 = wa_result-KF1.
    wa_result- Label = 'KF1'.
    elseif counter = 1.
    wa_result- KF1 = wa_result-KF2.
    wa_result- Label = 'KF2'.
    else.
    wa_result- KF1 = wa_result-KF3.
    wa_result- Label = 'KF3'.
    endif.
    APPEND wa_result TO t_result.
    counter = counter+1.
    endwhile.
    endloop.
    CLEAR: SOURCE_PACKAGE,wa_result.
    LOOP AT t_result INTO wa_result.
    APPEND wa_result TO SOURCE_PACKAGE.
    ENDLOOP.

  • XML Schema to generate table data from a repeating subform data

    Hi All, I would like to have a check box that when checked, will hide a quotation form, and make a purchase order form visible, carrying over some of the field data from the quotation form into a new table on the Purchase order form. I've attached this form at https://workspaces.acrobat.com/?d=pqpsXx5VPi*LkMeVKrX57w if you would like to take a look. When the checkbox is unchecked, it will hid the PO form, and make the quite form visible.
    The idea behind this is that my client will create his quote and send t to his customer. Once the customer accepts the quote, he can just click a button to generate his purchase order that he will send to his supplier.
    It seems that because I've got buttons to add rows on the quote form that the problem is more complex. I would be able to do this myself if the table had a fixed number of rows and I was able to use global fields and naming each cell something different, but beacuse it's a single repeating subform, I can't seem to make it work at all.
    I understand that because its a repeating subform that I need to create an XML schema to accomplish this, but also can't figure out for the life of me how to actually create the schema. I've been reading tons of tutorials, but no clue how to apply it to my specific need. I have only been able only find info on how to bind the data source once it's been created.
    I would be forever grateful if anyone could help me out.
    Thank you!

    I've edited your form and put it here.
    Here's what I've done:
    Inserted script into your checkbox renamed Accpted that hides/shows the Purchase Order/ Sales Quotation
    I've included a scripting object with a function I wrote to transfer data from like named fields/subforms from one section to another
    Inserted a few common fields into your Purchase Order table
    What you need to do is complete the development of your Purchase Order table. Make sure the common fields between the quote and purchase tables have the same names in order to transfer the data.
    No schema necessary.
    Kyle

  • How to copy table data from onde DB to another DB using clipboard

    HI,
    i copied table data from one DB to another DB, but it displays an error as "policy with check option violation" when inserting the table data.. so how to resolve the proble.. thanks in advance.

    DECLARE
    log_utl_dir VARCHAR2(100) :=('/apps/home/cmsftp/log/gaa');
    CURSOR tb_compy_cur is
    select tb.compy_acronym
    -- QC 158113 - added below
    ,tb.ivr_plan_num
    from tb_fc_compy tb,tb_xop_entitlements te
    where tb.grant_award_accept_flag = 'Y'
    and tb.ivr_plan_num = te.ivr_plan_num
    and te.entitle_name = 'GAA_RECONCILED'
    union all
    select compy_acronym
    -- QC 158113 - added below
    ,tb.ivr_plan_num
    from tb_fc_compy tb
    where tb.res_stock_flag = 'Y'
    --and   (tb.res_auto_lapse_flag = 2 OR
    --tb.res_auto_lapse_flag = 3)
    and exists (select entitle_name from tb_xop_entitlements te
    where tb.ivr_plan_num = te.ivr_plan_num
    and te.entitle_name = 'GAA_RES_FLAG'
    and te.optionee = 'Y'
    and te.psrep = 'Y'
    and te.sponsor = 'Y'
    and te.advisor = 'Y');
    v_xopgrantz_insertcount NUMBER := 0;
    -- QC 158113 - added below
    v_xopgrantz_accpt_count NUMBER := 0;
    v_user_id VARCHAR2(30);
    insert_file_id UTL_FILE.FILE_TYPE;
    insert_log_file varchar2(45) := 'xop_grantz_insertstats.log';
    BEGIN
    DBMS_OUTPUT.PUT_LINE('success1');
    insert_file_id := UTL_FILE.fopen(log_utl_dir,insert_log_file,'w');
    UTL_FILE.put_line(insert_file_id,'Starting the Process at '|| CURRENT_TIMESTAMP);
    UTL_FILE.put_line(insert_file_id,'INSERTING ROWS FOR Companies turned on for GAA_RECONCILE and GAA/RESSTOCK');
    for compy_rec in tb_compy_cur loop
    v_user_id := 'CMS'||compy_rec.compy_acronym||'_USER';
    ctx_set_session.set_user_session(v_user_id);
    dbms_output.put_line ('success2'||''|| v_user_id);
    INSERT into xop_grantz(grant_num,
    user_id,
    last_user_id,
    restrict_grant,
    child_symbol,
    parent_grant_flag,
    bulking_overide_flag,
    exerrestrict_code,
    rounding_method,
    exercisiable_dt,
    def_res_units_flag,
    opt_gain_def_elig_flag,
    opt_gain_deferred_flag,
    opt_gain_deferred_dt,
    opts_accepted,
    lst_updtby_usercd,
    accepted_type,
    GAA_eligible,
    GAA_LST_UPDTBY)
    select g.grant_num,
    v_user_id,
    'GRNTACCPT',
    'N',
    'N',
    (sel ect code
    from tb_xop_exerrestrict_codes
    where cash_allowed = 'Y'
    and cashlesshold_allowed = 'Y'
    and cashlesssell_allowed = 'Y'
    and stockswap_allowed = 'Y'
    and restricted_allowed = 'Y'
    and sar_allowed = 'Y'
    and cashmargin_allowed = 'Y'
    and cashpartial_allowed = 'Y'
    and sarsale_allowed = 'Y'),
    NULL,
    'N',
    'N',
    'N',
    NULL,
    NULL,
    NULL,
    'N',
    NULL,
    NULL
    from grantz g
    where not exists(select 1
    from xop_grantz xg
    where xg.grant_num = g.grant_num);
    v_xopgrantz_insertcount := SQL%ROWCOUNT;
    dbms_output.put_line ('1');
    -- QC158113 - Optimisation fix--starts
    DELETE FROM gt_xop_grant_accpt_type;
    INSERT INTO gt_xop_grant_accpt_type
    SELECT g.grant_num,e.ivr_plan_num,
    pk_xop_grntaccpt.fn_get_accpt_type (v_user_id,
    g.plan_num,
    g.grant_dt,
    g.opt_num,
    g.grant_cd,
    g.plan_type,
    'Y'
    FROM grantz g,tb_xop_entitlements e
    WHERE plan_type IN (2, 4, 5, 7, 8)
    and g.user_id = v_user_id
    and e.ivr_plan_num = compy_rec.ivr_plan_num
    and entitle_name = 'GAA_RES_FLAG' ;
    dbms_output.put_line ('success3');
    v_xopgrantz_accpt_count := SQL%ROWCOUNT;
    UTL_FILE.put_line(insert_file_id,'Inserted count in gt_xop_grant_acceptance '|| v_user_id||v_xopgrantz_accpt_count);
    -- QC158113 - Optimisation fix--ends
    COMMIT;
    UTL_FILE.put_line(insert_file_id,'Inserted count in XOP_GRANTZ for USER_ID '|| v_user_id||v_xopgrantz_insertcount);
    ctx_set_session.set_user_session('');
    dbms_output.put_line ('process completed');
    end loop;
    UTL_FILE.fclose(insert_file_id);
    EXCEPTION
    when others then
    rollback;
    dbms_output.put_line ('Code '||SQLCODE||':'||SQLERRM||' at '||v_user_id||' .pr_xopgrantz_insert');
    pr_xop_log_errors('Code '||SQLCODE||':'||SQLERRM||' at '||v_user_id||' .pr_xopgrantz_insert');
    pr_xop_log_errors('Code '||SQLCODE||':'||SQLERRM||'INSERTING into xop_grantz for ALL grants');
    END;
    i received this error when running the procedure also, so the table gt_xop_grant_accpt_type is not populated
    {Code -28115:ORA-28115: policy with check option violation at CMSFB_USER .pr_xopgrantz_insert}

  • Appraoch for archiving table data from a oracledb and load in archiv server

    Hi,
    I've a requirement where I need to archive and purge old data in datawarehouse.
    The archival strategy will select data from a list of tables and load into files.
    I also need to use sql loader control files to load data from the above files into archival server.
    I want to know which is the better approach to load data into files.
    Should I use utl_file or spool table data into file using select stmts.
    I also have some clob columns in some tables.

    I've doing something like this a couple of months ago. After some performance tests: the fastest way is to create files through UTL_FILE used in procedure with BULK SQL. Another good idea is to create files with Python which operates on text files blazingly. (Use PL/SQL if you need to create that files on server, but if you have to create files on remote machine use something else (Python?))

  • Uploading the data from a flat file into ztable

    Hi,
    I have a requirement where I have to upload the data from 2 flat files into 2 z tables(ZRB_HDR,ZRB_ITM).From the 1st flat file only data for few fields have to be uploaded into ztable(ZRB_HRD) .Fromthe 2nd flat file data for all the fields have to me uploaded into ztable(ZRB_ITM). How can I do this?
    Regards,
    Hema

    hi,
    declare two internal table with structur of your tables.
    your flat files should be .txt files.
    now make use of GUI_UPLOAD function module to upload your flatfile into internal tables.
    CALL FUNCTION 'GUI_UPLOAD'
        EXPORTING
          filename            = 'c:\file1.txt'
          has_field_separator = 'X'
        TABLES
          data_tab            = itab1
        EXCEPTIONS
          OTHERS              = 1.
    use this function twice for two tables.
    then loop them individually and make use of insert command.

  • How can I import data from a csv file into databse using utl_file?

    Hi,
    I have two machines (os is windows and database is oracle 10g) that are not connected to each other and both are having the same database schema but data is all different.
    Now on one machine, I want to take dump of all the tables into csv files. e.g. if my table name is test then the exported file is test.csv and if the table name is sample then csv file name is sample.csv and so on.
    Now I want to import the data from these csv files into the tables on second machine. if I've 50 such csv files, then data should be written to 50 tables.
    I am new to this. Could anyone please let me know how can I import data back into tables. i can't use sqlloader as I've to satisfy a few conditions while loading the data into tables. I am stuck and not able to proceed.
    Please let me know how can I do this.
    Thanks,
    Shilpi

    Why you want to export into .csv file.Why not export/import? What is your oracle version?
    Read http://www.oracle-base.com/articles/10g/oracle-data-pump-10g.php
    Regards
    Biju

  • Download table data from se16 to excel

    Hi I am trying to download table data from SE16 (field widths, descriptions etc) to Excel, but cannot as the option local file is greyed out under System>List>Save.
    Table>Print doesn't let mn downlaod either, jsut print. As I have 50 tables to download, is there a better option than copy and paste into excel?
    Thanks

    Hi,
    You can use the T-code SE11 for downloading the values from database table, after entering Table name ,
    click on Display (F7), it will take you to new screen, then enter (CtrlAltF10),
    Now enter the input values and execute.
    Kindly check with this.
    Best Regards,
    Vasu.

  • Query Data from other Oracle Database into current

    Hi all,
    I have to query data from another oracle database into the current oracle database. Because the customer has standard edition, I cannot use a pipe. I tried "SELECT column_name FROM external_oracle_db.schema.table WHERE column_name = 'column_value';" Unfortunately this does not work.
    Does anyone have a suggestion?
    Thanks
    Hans

    Have you tried with Database links?
    SELECT column_name FROM schema.table@external_oracle_db WHERE column_name = 'column_value';
    Satish

  • EXPORT/IMPORT TABLE DATA FROM ONE SCHEMA TO ANOTHER ONE (S.O.S)

    Hi,
    I urgently need your help:(, I have two different instances, in each of them there are two schemas, A and B; which tables are the same, but I need to transfer JUST the table data from A's tables to B's tables, how can I do so??
    Thanks in advance,
    Isabel

    The total number of tables is 989:(And how many do you want ? If 988, and if you're on a 10g db, you can use exclude parameter from expdp/impdp?
    Nicolas.

  • How to access internal table data from webdynpro to Flex application.

    Hi Connoisseur
    The data transfer from Abap WebDeypro to flex island works well. I followed , there is an example from Thomas Jung (by the way as always Great Work) and  Karthikeyan Venkatesan (Infosys) but this example covers simple type only.
    There is no example with complex types like arrayCollection which handle the transfer of data from flex to WebDynpro.
    i tried to do pass internal table value  to flex-datagrid.but its not work.
    i would like to know
    1.how to access internal table data from webdynpro to Flex application.
    2.how to pass the internal table to flex-datagrid.
    2.how to pass dynamically in ADOBE flex.
    3. how to do Flex is receiving the wd context data?
    4. how can we update WD context with FLEX data.
    Ple give me sample example and step by step procedure.
    Regards
    laxmikanth

    Hi Laxmikanth,
    Please refer this...
    Flash island: update complex type from flex
    Cheers..
    kris.

Maybe you are looking for