Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
Marteijn
Starting Member
28 Posts |
Posted - 2009-11-11 : 07:34:16
|
| Hi all,Working in SQL Server 2005 (Visual Studio) and I created 4 queries.Table 1 contains objects and table 2,3 and 4 contain values. Table 2, 3 and 4 are the same table (3 different queries on that table).This is what I like to see:Every record from Table 1 and the matching record from Table 2, 3 and 4 (on one line). If there is no match I want a null-value as result soI'd like to keep very object from Table 1.These are the queries on the tables:TABLE 1-------SELECT g.GEOTAXNR, g.VGONUM, g.VGOWOZNUM, g.CBRWYKKDE, g.CBRBRTKDE, g.ADRSTTNAM, g.ADRHUINUM, g.ADRHUILET, g.ADRHUITVG, g.ADRHUIAND, g.VGSOBJSRT, g.VGSOMS, g.VGSGBRKDE, g.VGOIDT, g.VGOADTWOZ, g.VDTINDRCN, g.ADRINDRCNFROM fact_BelastingObjecten AS gWHERE (g.VDTINDRCN = 'X') AND (g.ADRINDRCN = 'X') AND (g.VGOIDT < '20090102') AND (g.VGOADTWOZ = '00000000' OR g.VGOADTWOZ > '20090101')ORDER BY g.GEOTAXNRTABLE 2-------SELECT e.GEOTAXNR, e.CBBVGONUM, e.CBBVGOWOZNUM, e.VTGTAXDAT, e.VTGTAXNAM, e.VTGRDN, e.VTGRLT, e.VTGVSTWRD, e.VTGBSK, e.VTGOZBWRD, e.VTGHMSOZB, e.CBBVSLKDEFROM fact_BelastingTaxGegBeschikk AS e INNER JOIN (SELECT GEOTAXNR, MAX(VTGTAXDAT) AS TAXDATMAX FROM fact_BelastingTaxGegBeschikk WHERE (VTGWRDPJR = '2008') GROUP BY GEOTAXNR) AS f ON e.VTGTAXDAT = f.TAXDATMAX AND e.GEOTAXNR = f.GEOTAXNRWHERE (e.VTGWRDPJR = '2008')ORDER BY e.GEOTAXNRTABLE 3-------SELECT a.GEOTAXNR, a.CBBVGONUM, a.CBBVGOWOZNUM, a.VTGTAXDAT, a.VTGTAXNAM, a.VTGRDN, a.VTGRLT, a.VTGVSTWRD, a.VTGBSK, a.VTGOZBWRD, a.VTGHMSOZB, a.CBBVSLKDEFROM fact_BelastingTaxGegBeschikk AS a INNER JOIN (SELECT GEOTAXNR, MAX(VTGTAXDAT) AS TAXDATMAX FROM fact_BelastingTaxGegBeschikk WHERE (VTGWRDPJR = '2008') AND (VTGBSK = 'B') GROUP BY GEOTAXNR) AS b ON a.VTGTAXDAT = b.TAXDATMAX AND a.GEOTAXNR = b.GEOTAXNRWHERE (a.VTGWRDPJR = '2008') AND (a.VTGBSK = 'B')ORDER BY a.GEOTAXNRTABLE 4-------SELECT c.GEOTAXNR, c.CBBVGONUM, c.CBBVGOWOZNUM, c.VTGTAXDAT, c.VTGTAXNAM, c.VTGRDN, c.VTGRLT, c.VTGVSTWRD, c.VTGBSK, c.VTGOZBWRD, c.VTGHMSOZB, c.CBBVSLKDEFROM fact_BelastingTaxGegBeschikk AS c INNER JOIN (SELECT GEOTAXNR, MIN(VTGTAXDAT) AS TAXDATMIN FROM fact_BelastingTaxGegBeschikk WHERE (VTGWRDPJR = '2008') AND (VTGBSK = 'B') GROUP BY GEOTAXNR) AS d ON c.VTGTAXDAT = d.TAXDATMIN AND c.GEOTAXNR = d.GEOTAXNRWHERE (c.VTGWRDPJR = '2008') AND (c.VTGBSK = 'B')ORDER BY c.GEOTAXNRThe reason I made 3 queries on the table with values is that I like to see the results from those queries on one line.Is there an easy way to combine the queries above to one query which I can use in Visual Studio?I thank you already!!!Marteijn |
|
|
Ifor
Aged Yak Warrior
700 Posts |
Posted - 2009-11-11 : 09:18:34
|
The simple way is just to join the queries.Something like:;WITH Query1AS( SELECT g.GEOTAXNR, g.VGONUM, g.VGOWOZNUM, g.CBRWYKKDE, g.CBRBRTKDE, g.ADRSTTNAM, g.ADRHUINUM, g.ADRHUILET, g.ADRHUITVG, g.ADRHUIAND, g.VGSOBJSRT, g.VGSOMS, g.VGSGBRKDE, g.VGOIDT, g.VGOADTWOZ, g.VDTINDRCN, g.ADRINDRCN FROM fact_BelastingObjecten AS g WHERE (g.VDTINDRCN = 'X') AND (g.ADRINDRCN = 'X') AND (g.VGOIDT < '20090102') AND (g.VGOADTWOZ = '00000000' OR g.VGOADTWOZ > '20090101')),Query2AS( SELECT e.GEOTAXNR, e.CBBVGONUM, e.CBBVGOWOZNUM, e.VTGTAXDAT, e.VTGTAXNAM, e.VTGRDN, e.VTGRLT, e.VTGVSTWRD, e.VTGBSK, e.VTGOZBWRD, e.VTGHMSOZB, e.CBBVSLKDE FROM fact_BelastingTaxGegBeschikk AS e INNER JOIN (SELECT GEOTAXNR, MAX(VTGTAXDAT) AS TAXDATMAX FROM fact_BelastingTaxGegBeschikk WHERE (VTGWRDPJR = '2008') GROUP BY GEOTAXNR) AS f ON e.VTGTAXDAT = f.TAXDATMAX AND e.GEOTAXNR = f.GEOTAXNR WHERE (e.VTGWRDPJR = '2008')),Query3AS( SELECT a.GEOTAXNR, a.CBBVGONUM, a.CBBVGOWOZNUM, a.VTGTAXDAT, a.VTGTAXNAM, a.VTGRDN, a.VTGRLT, a.VTGVSTWRD, a.VTGBSK, a.VTGOZBWRD, a.VTGHMSOZB, a.CBBVSLKDE FROM fact_BelastingTaxGegBeschikk AS a INNER JOIN (SELECT GEOTAXNR, MAX(VTGTAXDAT) AS TAXDATMAX FROM fact_BelastingTaxGegBeschikk WHERE (VTGWRDPJR = '2008') AND (VTGBSK = 'B') GROUP BY GEOTAXNR) AS b ON a.VTGTAXDAT = b.TAXDATMAX AND a.GEOTAXNR = b.GEOTAXNR WHERE (a.VTGWRDPJR = '2008') AND (a.VTGBSK = 'B')),Query4AS( SELECT c.GEOTAXNR, c.CBBVGONUM, c.CBBVGOWOZNUM, c.VTGTAXDAT, c.VTGTAXNAM, c.VTGRDN, c.VTGRLT, c.VTGVSTWRD, c.VTGBSK, c.VTGOZBWRD, c.VTGHMSOZB, c.CBBVSLKDE FROM fact_BelastingTaxGegBeschikk AS c INNER JOIN (SELECT GEOTAXNR, MIN(VTGTAXDAT) AS TAXDATMIN FROM fact_BelastingTaxGegBeschikk WHERE (VTGWRDPJR = '2008') AND (VTGBSK = 'B') GROUP BY GEOTAXNR) AS d ON c.VTGTAXDAT = d.TAXDATMIN AND c.GEOTAXNR = d.GEOTAXNR WHERE (c.VTGWRDPJR = '2008') AND (c.VTGBSK = 'B'))SELECT *FROM Query1 Q1 LEFT JOIN Query Q2 ON Q1.GEOTAXNR = Q2.GEOTAXNR LEFT JOIN Query3 Q3 ON Q1.GEOTAXNR = Q3.GEOTAXNR LEFT JOIN Query4 Q4 ON Q1.GEOTAXNR = Q4.GEOTAXNRORDER BY Q1.GEOTAXNR Something like the following will probably be more efficient:;WITH CTE1AS( SELECT GEOTAXNR ,CBBVGONUM ,CBBVGOWOZNUM ,VTGTAXDAT ,VTGTAXNAM ,VTGRDN ,VTGRLT ,VTGVSTWRD ,VTGBSK ,VTGOZBWRD ,VTGHMSOZB ,CBBVSLKDE ,ROW_NUMBER() OVER (PARTITION BY GEOTAXNR ORDER BY VTGTAXDAT DESC) AS RowNum2 ,ROW_NUMBER() OVER (PARTITION BY GEOTAXNR, VTGBSK ORDER BY VTGTAXDAT DESC) AS RowNum3 ,ROW_NUMBER() OVER (PARTITION BY GEOTAXNR, VTGBSK ORDER BY VTGTAXDAT) AS RowNum4 FROM fact_BelastingTaxGegBeschikk WHERE VTGWRDPJR = '2008'),CTE2AS( SELECT GEOTAXNR ,MAX(CASE RowNum2 WHEN 1 THEN CBBVGONUM END) AS CBBVGONUM2 ,MAX(CASE RowNum2 WHEN 1 THEN CBBVGOWOZNUM END) AS CBBVGOWOZNUM2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGTAXDAT END) AS VTGTAXDAT2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGTAXNAM END) AS VTGTAXNAM2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGRDN END) AS VTGRDN2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGRLT END) AS VTGRLT2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGVSTWRD END) AS VTGVSTWRD2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGBSK END) AS VTGBSK2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGOZBWRD END) AS VTGOZBWRD2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGHMSOZB END) AS VTGHMSOZB2 ,MAX(CASE RowNum2 WHEN 1 THEN CBBVSLKDE END) AS CBBVSLKDE2 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN CBBVGONUM END) AS CBBVGONUM3 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN CBBVGOWOZNUM END) AS CBBVGOWOZNUM3 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN VTGTAXDAT END) AS VTGTAXDAT3 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN VTGTAXNAM END) AS VTGTAXNAM3 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN VTGRDN END) AS VTGRDN3 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN VTGRLT END) AS VTGRLT3 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN VTGVSTWRD END) AS VTGVSTWRD3 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN VTGBSK END) AS VTGBSK3 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN VTGOZBWRD END) AS VTGOZBWRD3 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN VTGHMSOZB END) AS VTGHMSOZB3 ,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN CBBVSLKDE END) AS CBBVSLKDE3 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B' THEN CBBVGONUM END) AS CBBVGONUM4 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B' THEN CBBVGOWOZNUM END) AS CBBVGOWOZNUM4 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B' THEN VTGTAXDAT END) AS VTGTAXDAT4 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B' THEN VTGTAXNAM END) AS VTGTAXNAM4 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B' THEN VTGRDN END) AS VTGRDN4 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B' THEN VTGRLT END) AS VTGRLT4 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B' THEN VTGVSTWRD END) AS VTGVSTWRD4 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B' THEN VTGBSK END) AS VTGBSK4 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B' THEN VTGOZBWRD END) AS VTGOZBWRD4 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B' THEN VTGHMSOZB END) AS VTGHMSOZB4 ,MAX(CASE RowNum4 WHEN 1 AND VTGBSK = 'B'THEN CBBVSLKDE END) AS CBBVSLKDE4 FROM CTE1 GROUP BY GEOTAXNR)SELECT g.GEOTAXNR ,g.VGONUM ,g.VGOWOZNUM ,g.CBRWYKKDE ,g.CBRBRTKDE ,g.ADRSTTNAM ,g.ADRHUINUM ,g.ADRHUILET ,g.ADRHUITVG ,g.ADRHUIAND ,g.VGSOBJSRT ,g.VGSOMS ,g.VGSGBRKDE ,g.VGOIDT ,g.VGOADTWOZ ,g.VDTINDRCN ,g.ADRINDRCN ,C.*FROM fact_BelastingObjecten AS g LEFT JOIN CTE2 C ON g.GEOTAXNR = C.GEOTAXNRWHERE g.VDTINDRCN = 'X' AND g.ADRINDRCN = 'X' AND g.VGOIDT < '20090102' AND ( g.VGOADTWOZ = '00000000' OR g.VGOADTWOZ > '20090101' )ORDER BY g.GEOTAXNR |
 |
|
|
Marteijn
Starting Member
28 Posts |
Posted - 2009-11-11 : 09:57:46
|
| Thank you very much for your answer! This helps me a lot! |
 |
|
|
Marteijn
Starting Member
28 Posts |
Posted - 2009-11-11 : 10:40:06
|
| When using your efficient query I get a syntax error on the following line:,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN CBBVGONUM END) AS CBBVGONUM3TITLE: Microsoft Report Designer------------------------------An error occurred while executing the query.Incorrect syntax near the keyword 'AND'.You have an idea where this SQL is going wrong?Extra info from Visual Studio...TITLE: Microsoft Report Designer------------------------------An error occurred while retrieving the parameters in the query.SqlCommand.DeriveParameters failed because the SqlCommand.CommandText property value is an invalid multipart name ";WITH CTE1AS( SELECT GEOTAXNR ,CBBVGONUM ,CBBVGOWOZNUM ,VTGTAXDAT ,VTGTAXNAM ,VTGRDN ,VTGRLT ,VTGVSTWRD ,VTGBSK ,VTGOZBWRD ,VTGHMSOZB ,CBBVSLKDE ,ROW_NUMBER() OVER (PARTITION BY GEOTAXNR ORDER BY VTGTAXDAT DESC) AS RowNum2 ,ROW_NUMBER() OVER (PARTITION BY GEOTAXNR, VTGBSK ORDER BY VTGTAXDAT DESC) AS RowNum3 ,ROW_NUMBER() OVER (PARTITION BY GEOTAXNR, VTGBSK ORDER BY VTGTAXDAT) AS RowNum4 FROM fact_BelastingTaxGegBeschikk WHERE VTGWRDPJR = '2008'),CTE2AS( SELECT GEOTAXNR ,MAX(CASE RowNum2 WHEN 1 THEN CBBVGONUM END) AS CBBVGONUM2 ,MAX(CASE RowNum2 WHEN 1 THEN CBBVGOWOZNUM END) AS CBBVGOWOZNUM2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGTAXDAT END) AS VTGTAXDAT2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGTAXNAM END) AS VTGTAXNAM2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGRDN END) AS VTGRDN2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGRLT END) AS VTGRLT2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGVSTWRD END) AS VTGVSTWRD2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGBSK END) AS VTGBSK2...", the current limit of "4" is insufficient.------------------------------ADDITIONAL INFORMATION:SqlCommand.DeriveParameters failed because the SqlCommand.CommandText property value is an invalid multipart name ";WITH CTE1AS( SELECT GEOTAXNR ,CBBVGONUM ,CBBVGOWOZNUM ,VTGTAXDAT ,VTGTAXNAM ,VTGRDN ,VTGRLT ,VTGVSTWRD ,VTGBSK ,VTGOZBWRD ,VTGHMSOZB ,CBBVSLKDE ,ROW_NUMBER() OVER (PARTITION BY GEOTAXNR ORDER BY VTGTAXDAT DESC) AS RowNum2 ,ROW_NUMBER() OVER (PARTITION BY GEOTAXNR, VTGBSK ORDER BY VTGTAXDAT DESC) AS RowNum3 ,ROW_NUMBER() OVER (PARTITION BY GEOTAXNR, VTGBSK ORDER BY VTGTAXDAT) AS RowNum4 FROM fact_BelastingTaxGegBeschikk WHERE VTGWRDPJR = '2008'),CTE2AS( SELECT GEOTAXNR ,MAX(CASE RowNum2 WHEN 1 THEN CBBVGONUM END) AS CBBVGONUM2 ,MAX(CASE RowNum2 WHEN 1 THEN CBBVGOWOZNUM END) AS CBBVGOWOZNUM2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGTAXDAT END) AS VTGTAXDAT2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGTAXNAM END) AS VTGTAXNAM2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGRDN END) AS VTGRDN2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGRLT END) AS VTGRLT2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGVSTWRD END) AS VTGVSTWRD2 ,MAX(CASE RowNum2 WHEN 1 THEN VTGBSK END) AS VTGBSK2...", the current limit of "4" is insufficient. (System.Data)------------------------------BUTTONS:OK------------------------------ |
 |
|
|
Ifor
Aged Yak Warrior
700 Posts |
Posted - 2009-11-11 : 13:09:10
|
quote: Originally posted by Marteijn When using your efficient query I get a syntax error on the following line:,MAX(CASE RowNum3 WHEN 1 AND VTGBSK = 'B' THEN CBBVGONUM END) AS CBBVGONUM3
Opps, should be:,MAX(CASE WHEN RowNum3 = 1 AND VTGBSK = 'B' THEN CBBVGONUM END) AS CBBVGONUM3 etc |
 |
|
|
Marteijn
Starting Member
28 Posts |
Posted - 2009-11-16 : 03:06:22
|
| Thank you very much! |
 |
|
|
|
|
|
|
|