2

1 日に複数の顧客バーコード スキャンについてデータベースをチェックするクエリがあります。このレポートはうまく機能しますが、もう 1 つ追加したいと思います。出力に「Times Scanned」列を含めたいと思います。ただし、「SUM」を使用しているため、1行に複数回リストされることはありません。たとえば、バーコード「1234」が 2 回スキャンされたことが判明した場合、スキャンされた回数 (tickets.dtcreated) が「スキャンされた回数」列に 1 つの出力として表示されるようにします。

これが私の現在の出力です:

Barcode    DtCreatedDate     Number of Scans   
    1234          1/1/2013            2            
    1235          1/1/2013            2            
    1563          1/2/2013            3         

出力を次のように表示します (「Times Scanned」には、複数のスキャンが行われた日の時間 (DTcreateddate) のみが表示されることに注意してください。

Barcode    DtCreatedDate     Number of Scans   Times Scanned
1234          1/1/2013            2            11:15AM, 12:15PM
1235          1/1/2013            2            9:00AM, 4:00PM
1563          1/2/2013            3            8:05AM, 8:08AM, 5:50PM

私の現在のクエリは以下です

 SELECT        Customers.sBarcode, CAST(FLOOR(CAST(Tickets.dtCreated AS FLOAT)) AS DATETIME) AS dtCreatedDate, COUNT(Customers.sBarcode) AS [Number of Scans]
FROM            Tickets INNER JOIN
                         Customers ON Tickets.lCustomerID = Customers.lCustomerID
WHERE        (Tickets.dtCreated BETWEEN @startdate AND @enddate) AND (Tickets.dblTotal <= 0)
GROUP BY Customers.sBarcode, CAST(FLOOR(CAST(Tickets.dtCreated AS FLOAT)) AS DATETIME)
HAVING        (COUNT(*) > 1)
ORDER BY dtCreatedDate
4

4 に答える 4

1

これには使用できませんが、使用SUMできますFOR XML PATH。これを SELECT リストに追加します。

SELECT ...,
       STUFF((    SELECT ', ' + RIGHT(convert(varchar, sub.dtCreated, 100), 7)
                    FROM Tickets sub
                    WHERE sub.Ticket_ID = Tickets.Ticket_ID
                    FOR XML PATH('')
                    ), 1, 2, '' )
       AS [Times Scanned]
FROM Tickets
JOIN ...

ここでの考え方は、 を使用RIGHT(convert(varchar, sub.dtCreated, 100), 7)してフォーマットされた時刻を取得し、 を使用してそれらを連結しFOR XML PATH、先頭のコンマを で削除することですSTUFF

于 2013-02-05T16:19:32.747 に答える
0

If you're using Oracle (and it's a recent build) you can use the LISTAGG() function

LISTAGG(TimesScanned, ', ') WITHIN GROUP (ORDER BY TimesScanned)

Other DBs sometimes have aggregate functions for this; see this question: Concatenate many rows into a single text string?

于 2013-05-28T16:12:22.940 に答える
0
SELECT Customers.sBarcode, @startdate AS startdate, @enddate AS enddate, 
       CAST(FLOOR(CAST(Tickets.dtCreated AS FLOAT)) AS DATETIME) AS dtCreatedDate, 
       COUNT(Customers.sBarcode) AS [Number of Scans], 
       [Times Scanned] = MAX(STUFF((SELECT ',' + RIGHT(CONVERT(varchar, sub.dtCreated, 100), 7)
                                    FROM Tickets AS sub
                                    WHERE sub.Ticket_id = Tickets.Ticket_ID
                                    FOR XML PATH, TYPE).value('.[1]', 'nvarchar(max)'), 1, 1, ''))
FROM Tickets INNER JOIN Customers ON Tickets.lCustomerID = Customers.lCustomerID
WHERE(Tickets.dtCreated BETWEEN @startdate AND @enddate) AND (Tickets.dblTotal <= 0)
GROUP BY Customers.sBarcode, CAST(FLOOR(CAST(Tickets.dtCreated AS FLOAT)) AS DATETIME), Tickets.Ticket_ID
HAVING (COUNT(*) > 1)
ORDER BY dtCreatedDate
于 2013-02-05T23:26:29.440 に答える
0

呼び出された時間のリストを作成する関数を作成し、クエリでその関数を呼び出すことをお勧めします。

于 2013-02-05T16:13:25.730 に答える