2016-11-05 4 views
0

Meine Auswahlabfrage:CrossTab SQL Server-Abfrage

SELECT  
    COUNT(*) * 500 AS TotalFee, 
    ISNULL(Employee.EFName, '') + ' ' + ISNULL(Employee.EMName, '') + ' ' + ISNULL(Employee.ELName, '') as Name, 
    CAST(MONTH(sdatetime) AS int) as Months 
FROM    
    Patient_Services 
INNER JOIN 
    Employee ON Patient_Services.Doctor_ID = Employee.EmpID 
WHERE 
    (Patient_Services.S_ID = 1606) 
    AND CAST(MONTH(sdatetime) AS INT) BETWEEN 1 AND 6 
GROUP BY 
    CAST(MONTH(sdatetime) AS INT), Employee.EFName, Employee.EMName, Employee.ELName 
ORDER BY 
    CAST(MONTH(Patient_Services.sdatetime) AS INT) 

Ergebnis

TotalFee |  Name  | Months 
38000  | AKIF DILSHAD |  1 
1500  | MATEEN AKRAM |  1 
1500  | AKIF DILSHAD |  2 
2200  | AKIF DILSHAD |  3 
1500  | NASERA BHATTI |  4 
500   | NASERA BHATTI |  5 
500   | NASERA BHATTI |  6 
12000  | AKIF DILSHAD |  6 

Meine gewünschten Ergebnisse:

Name   |Jan  |Feb |Mar |Apr |May |June |Total |60% |40% 
AKIF DILSHAD |38000 |1500 |2200 |0  |0  |12000 |53700 |32220 |21480 
MATEEN AKRAM |1500 |0  |0  |0  |0  |0  |1500 |900 |600 
NASERA BHATTI |0  |0  |0  |1500 |500 |500 |2500 |1500 |1000 

Bitte helfen Sie meine Anfrage zu konvertieren mein gewünschtes Ergebnis zu erhalten.

+0

Sollten Sie nicht so gut mit Namen werden Gruppierung? –

+0

Sie sollten [Pivot] verwenden (http://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server) – NEER

+0

Die 'MONTH()' Funktion ** bereits * * gibt ein 'INT' zurück - es gibt absolut keinen Grund und keinen Sinn darin, das zu einem' INT' explizit zu schreiben ... –

Antwort

0

Bitte versuchen Sie dies:

WITH cte as(
SELECT  COUNT(*)*500 AS TotalFee, ISNULL(Employee.EFName,'') +' '+ ISNULL(Employee.EMName,'') +' '+ ISNULL(Employee.ELName,'') as Name,CAST(MONTH(sdatetime) AS int) as Months 
FROM   Patient_Services INNER JOIN 
         Employee ON Patient_Services.Doctor_ID = Employee.EmpID 
WHERE  (Patient_Services.S_ID = 1606) AND CAST(MONTH(sdatetime) AS int) Between 1 AND 6 
GROUP BY CAST(MONTH(sdatetime) AS int),Employee.EFName, Employee.EMName, Employee.ELName 
--order by CAST(MONTH(Patient_Services.sdatetime) AS int) 
) 

    SELECT [NAME], 
     SUM(CASE Months WHEN 1 THEN TotalFee ELSE 0 End) as 'Jan' , 
     SUM(CASE Months WHEN 2 THEN TotalFee ELSE 0 End) as 'Feb' , 
     SUM(CASE Months WHEN 3 THEN TotalFee ELSE 0 End) as 'Mar' , 
     SUM(CASE Months WHEN 4 THEN TotalFee ELSE 0 End) as 'Apr' , 
     SUM(CASE Months WHEN 5 THEN TotalFee ELSE 0 End) as 'May' , 
     SUM(CASE Months WHEN 6 THEN TotalFee ELSE 0 End) as 'Jun' , 
     SUM(TotalFee) AS Total, 
     SUM(TotalFee)*.6 as [60%], 
     SUM(TotalFee)*.4 as [40%] 
     FROM CTE 
     GROUP BY [Name] 
+0

Danke Ahmed Saeed. Danke vielmals. –

+0

Ich möchte Sie fragen, dass nur die Monate anzeigen, die in welchem ​​Zustand übergeben. Wenn ich startmonth = 2 und endMonth = 7 übergebe, zeige nur 2 bis 7 Monate an. –

+0

Wenn Sie 2 bis 7 übergeben, zeigt Jan Null an, und Juli wird nicht als separater Monat angezeigt, sondern in den Summenspalten. Um einen beliebigen Monat anzuzeigen, kopieren Sie entweder die SUM/CASE-Anweisung für alle 12 Monate oder konvertieren die Abfrage in eine dynamische Abfrage. für dynamische Abfrage, bitte bereit über Dynamic PIVOT. –

Verwandte Themen