2016-07-20 16 views
0

Ich versuche, alle Daten nach allen Daten pro Monat abzurufen.Jedes Datum anzeigen, auch wenn es keinen Wert hat

Ich habe diese Tabelle. Ich habe ein Problem, wenn ich es bei sqlfiddle erstelle.

CREATE TABLE Outlet 
(
    IdOutlet [int] NOT NULL, 
    OutletCode [varchar](100) NOT NULL, 
    Description [varchar](225) NULL 
); 

Outlet Eintragung (en)

1 | K-AEON | Desc1 
2 | K-LFTEJM | Desc2 

und diese Tabelle

CREATE TABLE [dbo].[SalesOrderHeader] 
(
    [TransactionNo] [varchar](32) NOT NULL, 
    [DocumentNo] [varchar](32) NOT NULL, 
    [TransDate] [datetime] NOT NULL, 
    [ETADate] [datetime] NOT NULL, 
    [ExternalDocument] [varchar](32) NOT NULL, 
    [Reference] [varchar](64) NOT NULL, 
    [RefTransNo] [varchar](32) NOT NULL, 
    [Category] [varchar](32) NOT NULL, 
    [CustomerCode] [varchar](16) NOT NULL, 
    [Remark] [varchar](64) NOT NULL, 
    [Remark2] [varchar](64) NOT NULL, 
    [TermOfPayment] [datetime] NOT NULL, 
    [Currency] [varchar](16) NOT NULL, 
    [Rate] [decimal](38, 20) NOT NULL, 
    [UseVAT] [int] NOT NULL, 
    [SubTotal] [decimal](38, 20) NOT NULL, 
    [DiscPercent] [decimal](38, 20) NOT NULL, 
    [DiscAmount] [decimal](38, 20) NOT NULL, 
    [GrandTotal] [decimal](38, 20) NOT NULL, 
    [TotalReceivable] [decimal](38, 20) NOT NULL, 
    [FromCustomerCode] [varchar](32) NOT NULL, 
    [PostingStatus] [int] NULL, 
    [PostingBy] [varchar](16) NULL, 
    [PostingDate] [datetime] NULL, 
    [CreatedDate] [datetime] NOT NULL, 
    [CreatedBy] [varchar](16) NOT NULL, 
    [ModifiedDate] [datetime] NOT NULL, 
    [ModifiedBy] [varchar](16) NOT NULL, 
    [CustomerReceivable] [varchar](16) NULL, 
    [LocationCode] [varchar](16) NOT NULL, 
    [VatPercent] [float] NOT NULL, 
    [VatAmount] [float] NULL, 
    [FinalReleasedDate_Outlet] [datetime] NULL, 
    [CancelStatus] [int] NULL, 
    [CancelReason] [varchar](100) NULL, 
    [CancelledBy] [varchar](50) NULL, 

    CONSTRAINT [PK__SalesOrd__554342D81FCDBCEB] 
    PRIMARY KEY CLUSTERED ([TransactionNo] ASC) 
      WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
       ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

Wie Sie sehen Ich habe zwei Tabellen. Für jetzt habe ich diese Abfrage, um alle meine Daten zu holen.

select 
    CustomerCode, CONVERT(date, transdate) tanggal, 
    SUM(totalreceivable) total 
from 
    SalesOrderHeader 
where 
    TransDate between '$start_date' and '$end_date' 
group by 
    CONVERT(date, transdate), CustomerCode 

Hier ist ein Beispiel

führen
K-AEON  2016-07-18 2841600.00000000000000000000 
K-LFTEJM 2016-07-17 4862190.00000000000000000000 

Aber ich möchte dieses Ergebnis

  |1 | 2 | 3 | 4-16 |  17  | 18  | 19-29 |30| 
    K-AEON |..| | | ...... | 2841600 |   | ..... |..| 
    K-LFTEJM |..| | |  |    | 4862190 |  |..| 

Wie kann ich das erreichen? Welche Methode kann ich verwenden?

Ich will sie setzen auf sqlfiddle aber ich habe dieses Ergebnis Create script error

sorry für mein Englisch.

Antwort

1

Für das gewählte Datum;

CREATE TABLE #Test (OutletCode VARCHAR(50), Date_ DATETIME, TotalAmount DECIMAL(38, 20)) 

DECLARE @SelectedDate DATETIME = '2016.07.01' 
DECLARE @CountOfDay INT = 1 
DECLARE @DayCountForSelectedMonth INT = DATEDIFF(day, @SelectedDate, dateadd(month, 1, @SelectedDate)) 
DECLARE @Days NVARCHAR(MAX) 
DECLARE @Query NVARCHAR(MAX) 

INSERT INTO #Test VALUES ('K-AEON', '2016-07-18', 2841600.00000000000000000000) 
INSERT INTO #Test VALUES ('K-LFTEJM', '2016-07-17' ,4862190.00000000000000000000) 


;WITH CountOfDayTable(CountOfDay) 
AS 
(
    SELECT @CountOfDay 
    UNION ALL 
    SELECT CountOfDay + 1 
    FROM CountOfDayTable 
    WHERE CountOfDay < @DayCountForSelectedMonth 
) 

SELECT 
    @Days = COALESCE(@Days + ', ','') + '[' + CAST(CountOfDay AS NVARCHAR(4)) + ']' 
FROM CountOfDayTable C 
-- SELECT @Days -- [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31] 

SET @Query = 

    'SELECT * FROM (SELECT day(Date_) DayOfTrans, * FROM #Test) T 
    PIVOT(Max(TotalAmount) FOR DayOfTrans IN -- OR MIN 
      (' + 
        @Days 
       +  
      ') 
     ) FinalRes'; 

-- SELECT @Query 
EXEC sp_executesql @Query 
2

Betrachtet Ihr Beispiel Ergebnis ist

DECLARE @T AS TABLE (NAME VARCHAR(50), TransDate DATETIME, TotalReceivable DECIMAL(38, 20)) 

    INSERT INTO @T VALUES ('K-AEON', '2016-07-18', 2841600.00000000000000000000) 
    INSERT INTO @T VALUES ('K-LFTEJM', '2016-07-17' ,4862190.00000000000000000000) 

    SELECT * FROM (SELECT day(Transdate) DayOfTrans,*FROM @T) T 
    PIVOT(Max(TotalReceivable) FOR DayOfTrans 
    IN ([1], [2], [3], [17], [18], [19], [20])) FinalRes 

Die gewünschte Ausgabe,

Name  TransDate    1  2  3  17  18  19  20 
-------- ----------------------- ------- ------- ------- ------- ------- ------- ------- 
K-LFTEJM 2016-07-17 00:00:00.000 NULL NULL NULL 4862190.00000000000000000000 NULL NULL NULL 
K-AEON  2016-07-18 00:00:00.000 NULL NULL NULL NULL 2841600.00000000000000000000 NULL NULL 
+0

es ist fast wie, was ich will. Wie man den '[1] [2] [3]' zu allen Daten in einem Monat macht – YVS1102

+0

@ YVS1102: Danke. Möglicherweise müssen Sie eine dynamische Abfrage schreiben, um die [1], [2] s für den angegebenen Monat zu erhalten. Oder Sie behalten Spalten von [1] bis [31] und verwalten sie an Ihrem Front-End. – Lucky

+0

Wenn ich es 'static' schreibe, hat ein Monat [30] und [29] – YVS1102

Verwandte Themen